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
5fa6fbc1
Commit
5fa6fbc1
authored
Nov 04, 2015
by
Peter Eastman
Browse files
Finished implementing CompoundIntegrator
parent
af95a534
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
303 additions
and
117 deletions
+303
-117
openmmapi/include/openmm/CompoundIntegrator.h
openmmapi/include/openmm/CompoundIntegrator.h
+6
-0
openmmapi/src/CompoundIntegrator.cpp
openmmapi/src/CompoundIntegrator.cpp
+7
-0
platforms/cpu/tests/TestCpuCompoundIntegrator.cpp
platforms/cpu/tests/TestCpuCompoundIntegrator.cpp
+36
-0
platforms/cuda/include/CudaIntegrationUtilities.h
platforms/cuda/include/CudaIntegrationUtilities.h
+9
-0
platforms/cuda/include/CudaKernels.h
platforms/cuda/include/CudaKernels.h
+1
-2
platforms/cuda/include/CudaPlatform.h
platforms/cuda/include/CudaPlatform.h
+1
-1
platforms/cuda/src/CudaIntegrationUtilities.cpp
platforms/cuda/src/CudaIntegrationUtilities.cpp
+27
-4
platforms/cuda/src/CudaKernels.cpp
platforms/cuda/src/CudaKernels.cpp
+10
-50
platforms/cuda/src/CudaPlatform.cpp
platforms/cuda/src/CudaPlatform.cpp
+4
-1
platforms/cuda/tests/TestCudaCompoundIntegrator.cpp
platforms/cuda/tests/TestCudaCompoundIntegrator.cpp
+36
-0
platforms/opencl/include/OpenCLIntegrationUtilities.h
platforms/opencl/include/OpenCLIntegrationUtilities.h
+9
-0
platforms/opencl/include/OpenCLKernels.h
platforms/opencl/include/OpenCLKernels.h
+1
-2
platforms/opencl/include/OpenCLPlatform.h
platforms/opencl/include/OpenCLPlatform.h
+1
-1
platforms/opencl/src/OpenCLIntegrationUtilities.cpp
platforms/opencl/src/OpenCLIntegrationUtilities.cpp
+27
-4
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+10
-50
platforms/opencl/src/OpenCLPlatform.cpp
platforms/opencl/src/OpenCLPlatform.cpp
+4
-1
platforms/opencl/tests/TestOpenCLCompoundIntegrator.cpp
platforms/opencl/tests/TestOpenCLCompoundIntegrator.cpp
+36
-0
serialization/include/openmm/serialization/CompoundIntegratorProxy.h
...on/include/openmm/serialization/CompoundIntegratorProxy.h
+17
-0
serialization/src/CompoundIntegratorProxy.cpp
serialization/src/CompoundIntegratorProxy.cpp
+57
-0
serialization/src/SerializationProxyRegistration.cpp
serialization/src/SerializationProxyRegistration.cpp
+4
-1
No files found.
openmmapi/include/openmm/CompoundIntegrator.h
View file @
5fa6fbc1
...
...
@@ -94,6 +94,12 @@ public:
* @param index the index of the Integrator to get
*/
Integrator
&
getIntegrator
(
int
index
);
/**
* Get a const reference to one of the Integrators that have been added to this CompoundIntegrator.
*
* @param index the index of the Integrator to get
*/
const
Integrator
&
getIntegrator
(
int
index
)
const
;
/**
* Get the index of the current Integrator.
*/
...
...
openmmapi/src/CompoundIntegrator.cpp
View file @
5fa6fbc1
...
...
@@ -64,6 +64,11 @@ Integrator& CompoundIntegrator::getIntegrator(int index) {
return
*
integrators
[
index
];
}
const
Integrator
&
CompoundIntegrator
::
getIntegrator
(
int
index
)
const
{
ASSERT_VALID_INDEX
(
index
,
integrators
);
return
*
integrators
[
index
];
}
int
CompoundIntegrator
::
getCurrentIntegrator
()
const
{
return
currentIntegrator
;
}
...
...
@@ -95,6 +100,8 @@ void CompoundIntegrator::step(int steps) {
}
void
CompoundIntegrator
::
initialize
(
ContextImpl
&
context
)
{
if
(
integrators
.
size
()
==
0
)
throw
OpenMMException
(
"CompoundIntegrator must contain at least one Integrator"
);
for
(
int
i
=
0
;
i
<
integrators
.
size
();
i
++
)
integrators
[
i
]
->
initialize
(
context
);
}
...
...
platforms/cpu/tests/TestCpuCompoundIntegrator.cpp
0 → 100644
View file @
5fa6fbc1
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2015 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "CpuTests.h"
#include "TestCompoundIntegrator.h"
void
runPlatformTests
()
{
}
platforms/cuda/include/CudaIntegrationUtilities.h
View file @
5fa6fbc1
...
...
@@ -62,6 +62,14 @@ public:
CudaArray
&
getStepSize
()
{
return
*
stepSize
;
}
/**
* Set the size to use for the next step.
*/
void
setNextStepSize
(
double
size
);
/**
* Get the size that was used for the last step.
*/
double
getLastStepSize
();
/**
* Apply constraints to the atom positions.
*
...
...
@@ -154,6 +162,7 @@ private:
CudaArray
*
vsiteLocalCoordsParams
;
int
randomPos
;
int
lastSeed
,
numVsites
;
double2
lastStepSize
;
struct
ShakeCluster
;
struct
ConstraintOrderer
;
};
...
...
platforms/cuda/include/CudaKernels.h
View file @
5fa6fbc1
...
...
@@ -1123,7 +1123,6 @@ public:
double
computeKineticEnergy
(
ContextImpl
&
context
,
const
VerletIntegrator
&
integrator
);
private:
CudaContext
&
cu
;
double
prevStepSize
;
CUfunction
kernel1
,
kernel2
;
};
...
...
@@ -1354,7 +1353,7 @@ private:
void
recordChangedParameters
(
ContextImpl
&
context
);
bool
evaluateCondition
(
int
step
);
CudaContext
&
cu
;
double
prevStepSize
,
energy
;
double
energy
;
float
energyFloat
;
int
numGlobalVariables
;
bool
hasInitializedKernels
,
deviceValuesAreCurrent
,
deviceGlobalsAreCurrent
,
modifiesParameters
,
keNeedsForce
,
hasAnyConstraints
;
...
...
platforms/cuda/include/CudaPlatform.h
View file @
5fa6fbc1
...
...
@@ -121,7 +121,7 @@ public:
ContextImpl
*
context
;
std
::
vector
<
CudaContext
*>
contexts
;
std
::
vector
<
double
>
contextEnergy
;
bool
removeCM
,
peerAccessSupported
,
useCpuPme
;
bool
hasInitializedContexts
,
removeCM
,
peerAccessSupported
,
useCpuPme
;
int
cmMotionFrequency
;
int
stepCount
,
computeForceCount
;
double
time
;
...
...
platforms/cuda/src/CudaIntegrationUtilities.cpp
View file @
5fa6fbc1
...
...
@@ -106,21 +106,21 @@ CudaIntegrationUtilities::CudaIntegrationUtilities(CudaContext& context, const S
vsiteOutOfPlaneAtoms
(
NULL
),
vsiteOutOfPlaneWeights
(
NULL
),
vsiteLocalCoordsAtoms
(
NULL
),
vsiteLocalCoordsParams
(
NULL
)
{
// Create workspace arrays.
lastStepSize
=
make_double2
(
0.0
,
0.0
);
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
{
posDelta
=
CudaArray
::
create
<
double4
>
(
context
,
context
.
getPaddedNumAtoms
(),
"posDelta"
);
vector
<
double4
>
deltas
(
posDelta
->
getSize
(),
make_double4
(
0.0
,
0.0
,
0.0
,
0.0
));
posDelta
->
upload
(
deltas
);
stepSize
=
CudaArray
::
create
<
double2
>
(
context
,
1
,
"stepSize"
);
vector
<
double2
>
step
(
1
,
make_double2
(
0.0
,
0.0
));
stepSize
->
upload
(
step
);
stepSize
->
upload
(
&
lastStepSize
);
}
else
{
posDelta
=
CudaArray
::
create
<
float4
>
(
context
,
context
.
getPaddedNumAtoms
(),
"posDelta"
);
vector
<
float4
>
deltas
(
posDelta
->
getSize
(),
make_float4
(
0.0
f
,
0.0
f
,
0.0
f
,
0.0
f
));
posDelta
->
upload
(
deltas
);
stepSize
=
CudaArray
::
create
<
float2
>
(
context
,
1
,
"stepSize"
);
vector
<
float2
>
step
(
1
,
make_float2
(
0.0
f
,
0.0
f
)
)
;
stepSize
->
upload
(
step
);
float2
lastStepSizeFloat
=
make_float2
(
0.0
f
,
0.0
f
);
stepSize
->
upload
(
&
lastStepSizeFloat
);
}
// Record the set of constraints and how many constraints each atom is involved in.
...
...
@@ -650,6 +650,29 @@ CudaIntegrationUtilities::~CudaIntegrationUtilities() {
delete
vsiteLocalCoordsParams
;
}
void
CudaIntegrationUtilities
::
setNextStepSize
(
double
size
)
{
if
(
size
!=
lastStepSize
.
x
||
size
!=
lastStepSize
.
y
)
{
lastStepSize
=
make_double2
(
size
,
size
);
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
stepSize
->
upload
(
&
lastStepSize
);
else
{
float2
lastStepSizeFloat
=
make_float2
((
float
)
size
,
(
float
)
size
);
stepSize
->
upload
(
&
lastStepSizeFloat
);
}
}
}
double
CudaIntegrationUtilities
::
getLastStepSize
()
{
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
stepSize
->
download
(
&
lastStepSize
);
else
{
float2
lastStepSizeFloat
;
stepSize
->
download
(
&
lastStepSizeFloat
);
lastStepSize
=
make_double2
(
lastStepSizeFloat
.
x
,
lastStepSizeFloat
.
y
);
}
return
lastStepSize
.
y
;
}
void
CudaIntegrationUtilities
::
applyConstraints
(
double
tol
)
{
applyConstraints
(
false
,
tol
);
}
...
...
platforms/cuda/src/CudaKernels.cpp
View file @
5fa6fbc1
...
...
@@ -5674,7 +5674,6 @@ void CudaIntegrateVerletStepKernel::initialize(const System& system, const Verle
CUmodule
module
=
cu
.
createModule
(
CudaKernelSources
::
verlet
,
defines
,
""
);
kernel1
=
cu
.
getKernel
(
module
,
"integrateVerletPart1"
);
kernel2
=
cu
.
getKernel
(
module
,
"integrateVerletPart2"
);
prevStepSize
=
-
1.0
;
}
void
CudaIntegrateVerletStepKernel
::
execute
(
ContextImpl
&
context
,
const
VerletIntegrator
&
integrator
)
{
...
...
@@ -5683,19 +5682,7 @@ void CudaIntegrateVerletStepKernel::execute(ContextImpl& context, const VerletIn
int
numAtoms
=
cu
.
getNumAtoms
();
int
paddedNumAtoms
=
cu
.
getPaddedNumAtoms
();
double
dt
=
integrator
.
getStepSize
();
if
(
dt
!=
prevStepSize
)
{
if
(
cu
.
getUseDoublePrecision
()
||
cu
.
getUseMixedPrecision
())
{
vector
<
double2
>
stepSizeVec
(
1
);
stepSizeVec
[
0
]
=
make_double2
(
dt
,
dt
);
cu
.
getIntegrationUtilities
().
getStepSize
().
upload
(
stepSizeVec
);
}
else
{
vector
<
float2
>
stepSizeVec
(
1
);
stepSizeVec
[
0
]
=
make_float2
((
float
)
dt
,
(
float
)
dt
);
cu
.
getIntegrationUtilities
().
getStepSize
().
upload
(
stepSizeVec
);
}
prevStepSize
=
dt
;
}
cu
.
getIntegrationUtilities
().
setNextStepSize
(
dt
);
// Call the first integration kernel.
...
...
@@ -5752,6 +5739,7 @@ void CudaIntegrateLangevinStepKernel::execute(ContextImpl& context, const Langev
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
stepSize
=
integrator
.
getStepSize
();
cu
.
getIntegrationUtilities
().
setNextStepSize
(
stepSize
);
if
(
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
stepSize
!=
prevStepSize
)
{
// Calculate the integration parameters.
...
...
@@ -5766,8 +5754,6 @@ void CudaIntegrateLangevinStepKernel::execute(ContextImpl& context, const Langev
p
[
1
]
=
fscale
;
p
[
2
]
=
noisescale
;
params
->
upload
(
p
);
double2
ss
=
make_double2
(
0
,
stepSize
);
integration
.
getStepSize
().
upload
(
&
ss
);
}
else
{
vector
<
float
>
p
(
params
->
getSize
());
...
...
@@ -5775,8 +5761,6 @@ void CudaIntegrateLangevinStepKernel::execute(ContextImpl& context, const Langev
p
[
1
]
=
(
float
)
fscale
;
p
[
2
]
=
(
float
)
noisescale
;
params
->
upload
(
p
);
float2
ss
=
make_float2
(
0
,
(
float
)
stepSize
);
integration
.
getStepSize
().
upload
(
&
ss
);
}
prevTemp
=
temperature
;
prevFriction
=
friction
;
...
...
@@ -5929,20 +5913,13 @@ double CudaIntegrateVariableVerletStepKernel::execute(ContextImpl& context, cons
// Update the time and step count.
double
dt
,
time
;
double
dt
=
cu
.
getIntegrationUtilities
().
getLastStepSize
();
double
time
=
cu
.
getTime
()
+
dt
;
if
(
useDouble
)
{
double2
stepSize
;
cu
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cu
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSize
)
time
=
maxTime
;
// Avoid round-off error
}
else
{
float2
stepSize
;
cu
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cu
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSizeFloat
)
time
=
maxTime
;
// Avoid round-off error
}
...
...
@@ -6023,20 +6000,13 @@ double CudaIntegrateVariableLangevinStepKernel::execute(ContextImpl& context, co
// Update the time and step count.
double
dt
,
time
;
double
dt
=
cu
.
getIntegrationUtilities
().
getLastStepSize
();
double
time
=
cu
.
getTime
()
+
dt
;
if
(
useDouble
)
{
double2
stepSize
;
cu
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cu
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSize
)
time
=
maxTime
;
// Avoid round-off error
}
else
{
float2
stepSize
;
cu
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cu
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSizeFloat
)
time
=
maxTime
;
// Avoid round-off error
}
...
...
@@ -6139,7 +6109,6 @@ void CudaIntegrateCustomStepKernel::initialize(const System& system, const Custo
summedValue
=
new
CudaArray
(
cu
,
1
,
elementSize
,
"summedValue"
);
perDofValues
=
new
CudaParameterSet
(
cu
,
integrator
.
getNumPerDofVariables
(),
3
*
system
.
getNumParticles
(),
"perDofVariables"
,
false
,
cu
.
getUseDoublePrecision
()
||
cu
.
getUseMixedPrecision
());
cu
.
addReorderListener
(
new
ReorderListener
(
cu
,
*
perDofValues
,
localPerDofValuesFloat
,
localPerDofValuesDouble
,
deviceValuesAreCurrent
));
prevStepSize
=
-
1.0
;
SimTKOpenMMUtilities
::
setRandomNumberSeed
(
integrator
.
getRandomNumberSeed
());
}
...
...
@@ -6553,9 +6522,7 @@ void CudaIntegrateCustomStepKernel::prepareForComputation(ContextImpl& context,
}
localValuesAreCurrent
=
false
;
double
stepSize
=
integrator
.
getStepSize
();
if
(
stepSize
!=
prevStepSize
)
{
recordGlobalValue
(
stepSize
,
GlobalTarget
(
DT
,
dtVariableIndex
));
}
recordGlobalValue
(
stepSize
,
GlobalTarget
(
DT
,
dtVariableIndex
));
for
(
int
i
=
0
;
i
<
(
int
)
parameterNames
.
size
();
i
++
)
{
double
value
=
context
.
getParameter
(
parameterNames
[
i
]);
if
(
value
!=
globalValuesDouble
[
parameterVariableIndex
[
i
]])
{
...
...
@@ -6760,17 +6727,10 @@ double CudaIntegrateCustomStepKernel::computeKineticEnergy(ContextImpl& context,
void
CudaIntegrateCustomStepKernel
::
recordGlobalValue
(
double
value
,
GlobalTarget
target
)
{
switch
(
target
.
type
)
{
case
DT
:
if
(
value
!=
globalValuesDouble
[
dtVariableIndex
])
deviceGlobalsAreCurrent
=
false
;
globalValuesDouble
[
dtVariableIndex
]
=
value
;
deviceGlobalsAreCurrent
=
false
;
if
(
cu
.
getUseDoublePrecision
()
||
cu
.
getUseMixedPrecision
())
{
double
size
[]
=
{
0
,
value
};
cu
.
getIntegrationUtilities
().
getStepSize
().
upload
(
size
);
}
else
{
float
size
[]
=
{
0
,
(
float
)
value
};
cu
.
getIntegrationUtilities
().
getStepSize
().
upload
(
size
);
}
prevStepSize
=
value
;
cu
.
getIntegrationUtilities
().
setNextStepSize
(
value
);
break
;
case
VARIABLE
:
case
PARAMETER
:
...
...
platforms/cuda/src/CudaPlatform.cpp
View file @
5fa6fbc1
...
...
@@ -179,7 +179,7 @@ void CudaPlatform::contextDestroyed(ContextImpl& context) const {
}
CudaPlatform
::
PlatformData
::
PlatformData
(
ContextImpl
*
context
,
const
System
&
system
,
const
string
&
deviceIndexProperty
,
const
string
&
blockingProperty
,
const
string
&
precisionProperty
,
const
string
&
cpuPmeProperty
,
const
string
&
compilerProperty
,
const
string
&
tempProperty
,
const
string
&
hostCompilerProperty
)
:
context
(
context
),
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
)
{
const
string
&
cpuPmeProperty
,
const
string
&
compilerProperty
,
const
string
&
tempProperty
,
const
string
&
hostCompilerProperty
)
:
context
(
context
),
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
)
,
hasInitializedContexts
(
false
)
{
bool
blocking
=
(
blockingProperty
==
"true"
);
vector
<
string
>
devices
;
size_t
searchPos
=
0
,
nextPos
;
...
...
@@ -247,8 +247,11 @@ CudaPlatform::PlatformData::~PlatformData() {
}
void
CudaPlatform
::
PlatformData
::
initializeContexts
(
const
System
&
system
)
{
if
(
hasInitializedContexts
)
return
;
for
(
int
i
=
0
;
i
<
(
int
)
contexts
.
size
();
i
++
)
contexts
[
i
]
->
initialize
();
hasInitializedContexts
=
true
;
}
void
CudaPlatform
::
PlatformData
::
syncContexts
()
{
...
...
platforms/cuda/tests/TestCudaCompoundIntegrator.cpp
0 → 100644
View file @
5fa6fbc1
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2015 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "CudaTests.h"
#include "TestCompoundIntegrator.h"
void
runPlatformTests
()
{
}
platforms/opencl/include/OpenCLIntegrationUtilities.h
View file @
5fa6fbc1
...
...
@@ -62,6 +62,14 @@ public:
OpenCLArray
&
getStepSize
()
{
return
*
stepSize
;
}
/**
* Set the size to use for the next step.
*/
void
setNextStepSize
(
double
size
);
/**
* Get the size that was used for the last step.
*/
double
getLastStepSize
();
/**
* Apply constraints to the atom positions.
*
...
...
@@ -153,6 +161,7 @@ private:
int
randomPos
;
int
lastSeed
,
numVsites
;
bool
hasInitializedPosConstraintKernels
,
hasInitializedVelConstraintKernels
,
ccmaUseDirectBuffer
,
hasOverlappingVsites
;
mm_double2
lastStepSize
;
struct
ShakeCluster
;
struct
ConstraintOrderer
;
};
...
...
platforms/opencl/include/OpenCLKernels.h
View file @
5fa6fbc1
...
...
@@ -1103,7 +1103,6 @@ public:
double
computeKineticEnergy
(
ContextImpl
&
context
,
const
VerletIntegrator
&
integrator
);
private:
OpenCLContext
&
cl
;
double
prevStepSize
;
bool
hasInitializedKernels
;
cl
::
Kernel
kernel1
,
kernel2
;
};
...
...
@@ -1342,7 +1341,7 @@ private:
void
recordChangedParameters
(
ContextImpl
&
context
);
bool
evaluateCondition
(
int
step
);
OpenCLContext
&
cl
;
double
prevStepSize
,
energy
;
double
energy
;
float
energyFloat
;
int
numGlobalVariables
;
bool
hasInitializedKernels
,
deviceValuesAreCurrent
,
deviceGlobalsAreCurrent
,
modifiesParameters
,
keNeedsForce
,
hasAnyConstraints
;
...
...
platforms/opencl/include/OpenCLPlatform.h
View file @
5fa6fbc1
...
...
@@ -106,7 +106,7 @@ public:
ContextImpl
*
context
;
std
::
vector
<
OpenCLContext
*>
contexts
;
std
::
vector
<
double
>
contextEnergy
;
bool
removeCM
,
useCpuPme
;
bool
hasInitializedContexts
,
removeCM
,
useCpuPme
;
int
cmMotionFrequency
;
int
stepCount
,
computeForceCount
;
double
time
;
...
...
platforms/opencl/src/OpenCLIntegrationUtilities.cpp
View file @
5fa6fbc1
...
...
@@ -106,21 +106,21 @@ OpenCLIntegrationUtilities::OpenCLIntegrationUtilities(OpenCLContext& context, c
hasInitializedPosConstraintKernels
(
false
),
hasInitializedVelConstraintKernels
(
false
),
hasOverlappingVsites
(
false
)
{
// Create workspace arrays.
lastStepSize
=
mm_double2
(
0.0
,
0.0
);
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
{
posDelta
=
OpenCLArray
::
create
<
mm_double4
>
(
context
,
context
.
getPaddedNumAtoms
(),
"posDelta"
);
vector
<
mm_double4
>
deltas
(
posDelta
->
getSize
(),
mm_double4
(
0.0
,
0.0
,
0.0
,
0.0
));
posDelta
->
upload
(
deltas
);
stepSize
=
OpenCLArray
::
create
<
mm_double2
>
(
context
,
1
,
"stepSize"
);
vector
<
mm_double2
>
step
(
1
,
mm_double2
(
0.0
,
0.0
));
stepSize
->
upload
(
step
);
stepSize
->
upload
(
&
lastStepSize
);
}
else
{
posDelta
=
OpenCLArray
::
create
<
mm_float4
>
(
context
,
context
.
getPaddedNumAtoms
(),
"posDelta"
);
vector
<
mm_float4
>
deltas
(
posDelta
->
getSize
(),
mm_float4
(
0.0
f
,
0.0
f
,
0.0
f
,
0.0
f
));
posDelta
->
upload
(
deltas
);
stepSize
=
OpenCLArray
::
create
<
mm_float2
>
(
context
,
1
,
"stepSize"
);
vector
<
mm_float2
>
step
(
1
,
mm_float2
(
0.0
f
,
0.0
f
)
)
;
stepSize
->
upload
(
step
);
mm_float2
lastStepSizeFloat
=
mm_float2
(
0.0
f
,
0.0
f
);
stepSize
->
upload
(
&
lastStepSizeFloat
);
}
// Create the time shift kernel for calculating kinetic energy.
...
...
@@ -724,6 +724,29 @@ OpenCLIntegrationUtilities::~OpenCLIntegrationUtilities() {
delete
vsiteLocalCoordsParams
;
}
void
OpenCLIntegrationUtilities
::
setNextStepSize
(
double
size
)
{
if
(
size
!=
lastStepSize
.
x
||
size
!=
lastStepSize
.
y
)
{
lastStepSize
=
mm_double2
(
size
,
size
);
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
stepSize
->
upload
(
&
lastStepSize
);
else
{
mm_float2
lastStepSizeFloat
=
mm_float2
((
float
)
size
,
(
float
)
size
);
stepSize
->
upload
(
&
lastStepSizeFloat
);
}
}
}
double
OpenCLIntegrationUtilities
::
getLastStepSize
()
{
if
(
context
.
getUseDoublePrecision
()
||
context
.
getUseMixedPrecision
())
stepSize
->
download
(
&
lastStepSize
);
else
{
mm_float2
lastStepSizeFloat
;
stepSize
->
download
(
&
lastStepSizeFloat
);
lastStepSize
=
mm_double2
(
lastStepSizeFloat
.
x
,
lastStepSizeFloat
.
y
);
}
return
lastStepSize
.
y
;
}
void
OpenCLIntegrationUtilities
::
applyConstraints
(
double
tol
)
{
applyConstraints
(
false
,
tol
);
}
...
...
platforms/opencl/src/OpenCLKernels.cpp
View file @
5fa6fbc1
...
...
@@ -5866,7 +5866,6 @@ void OpenCLIntegrateVerletStepKernel::initialize(const System& system, const Ver
cl
::
Program
program
=
cl
.
createProgram
(
OpenCLKernelSources
::
verlet
,
""
);
kernel1
=
cl
::
Kernel
(
program
,
"integrateVerletPart1"
);
kernel2
=
cl
::
Kernel
(
program
,
"integrateVerletPart2"
);
prevStepSize
=
-
1.0
;
}
void
OpenCLIntegrateVerletStepKernel
::
execute
(
ContextImpl
&
context
,
const
VerletIntegrator
&
integrator
)
{
...
...
@@ -5889,19 +5888,7 @@ void OpenCLIntegrateVerletStepKernel::execute(ContextImpl& context, const Verlet
kernel2
.
setArg
<
cl
::
Buffer
>
(
4
,
cl
.
getVelm
().
getDeviceBuffer
());
kernel2
.
setArg
<
cl
::
Buffer
>
(
5
,
integration
.
getPosDelta
().
getDeviceBuffer
());
}
if
(
dt
!=
prevStepSize
)
{
if
(
cl
.
getUseDoublePrecision
()
||
cl
.
getUseMixedPrecision
())
{
vector
<
mm_double2
>
stepSizeVec
(
1
);
stepSizeVec
[
0
]
=
mm_double2
(
dt
,
dt
);
cl
.
getIntegrationUtilities
().
getStepSize
().
upload
(
stepSizeVec
);
}
else
{
vector
<
mm_float2
>
stepSizeVec
(
1
);
stepSizeVec
[
0
]
=
mm_float2
((
cl_float
)
dt
,
(
cl_float
)
dt
);
cl
.
getIntegrationUtilities
().
getStepSize
().
upload
(
stepSizeVec
);
}
prevStepSize
=
dt
;
}
cl
.
getIntegrationUtilities
().
setNextStepSize
(
dt
);
// Call the first integration kernel.
...
...
@@ -5971,6 +5958,7 @@ void OpenCLIntegrateLangevinStepKernel::execute(ContextImpl& context, const Lang
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
stepSize
=
integrator
.
getStepSize
();
cl
.
getIntegrationUtilities
().
setNextStepSize
(
stepSize
);
if
(
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
stepSize
!=
prevStepSize
)
{
// Calculate the integration parameters.
...
...
@@ -5985,8 +5973,6 @@ void OpenCLIntegrateLangevinStepKernel::execute(ContextImpl& context, const Lang
p
[
1
]
=
fscale
;
p
[
2
]
=
noisescale
;
params
->
upload
(
p
);
mm_double2
ss
=
mm_double2
(
0
,
stepSize
);
integration
.
getStepSize
().
upload
(
&
ss
);
}
else
{
vector
<
cl_float
>
p
(
params
->
getSize
());
...
...
@@ -5994,8 +5980,6 @@ void OpenCLIntegrateLangevinStepKernel::execute(ContextImpl& context, const Lang
p
[
1
]
=
(
cl_float
)
fscale
;
p
[
2
]
=
(
cl_float
)
noisescale
;
params
->
upload
(
p
);
mm_float2
ss
=
mm_float2
(
0
,
(
float
)
stepSize
);
integration
.
getStepSize
().
upload
(
&
ss
);
}
prevTemp
=
temperature
;
prevFriction
=
friction
;
...
...
@@ -6186,20 +6170,13 @@ double OpenCLIntegrateVariableVerletStepKernel::execute(ContextImpl& context, co
// Update the time and step count.
double
dt
,
time
;
double
dt
=
cl
.
getIntegrationUtilities
().
getLastStepSize
();
double
time
=
cl
.
getTime
()
+
dt
;
if
(
useDouble
)
{
mm_double2
stepSize
;
cl
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cl
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSize
)
time
=
maxTime
;
// Avoid round-off error
}
else
{
mm_float2
stepSize
;
cl
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cl
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSizeFloat
)
time
=
maxTime
;
// Avoid round-off error
}
...
...
@@ -6300,20 +6277,13 @@ double OpenCLIntegrateVariableLangevinStepKernel::execute(ContextImpl& context,
// Update the time and step count.
double
dt
,
time
;
double
dt
=
cl
.
getIntegrationUtilities
().
getLastStepSize
();
double
time
=
cl
.
getTime
()
+
dt
;
if
(
useDouble
)
{
mm_double2
stepSize
;
cl
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cl
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSize
)
time
=
maxTime
;
// Avoid round-off error
}
else
{
mm_float2
stepSize
;
cl
.
getIntegrationUtilities
().
getStepSize
().
download
(
&
stepSize
);
dt
=
stepSize
.
y
;
time
=
cl
.
getTime
()
+
dt
;
if
(
dt
==
maxStepSizeFloat
)
time
=
maxTime
;
// Avoid round-off error
}
...
...
@@ -6414,7 +6384,6 @@ void OpenCLIntegrateCustomStepKernel::initialize(const System& system, const Cus
summedValue
=
new
OpenCLArray
(
cl
,
1
,
elementSize
,
"summedValue"
);
perDofValues
=
new
OpenCLParameterSet
(
cl
,
integrator
.
getNumPerDofVariables
(),
3
*
system
.
getNumParticles
(),
"perDofVariables"
,
false
,
cl
.
getUseDoublePrecision
()
||
cl
.
getUseMixedPrecision
());
cl
.
addReorderListener
(
new
ReorderListener
(
cl
,
*
perDofValues
,
localPerDofValuesFloat
,
localPerDofValuesDouble
,
deviceValuesAreCurrent
));
prevStepSize
=
-
1.0
;
SimTKOpenMMUtilities
::
setRandomNumberSeed
(
integrator
.
getRandomNumberSeed
());
}
...
...
@@ -6825,9 +6794,7 @@ void OpenCLIntegrateCustomStepKernel::prepareForComputation(ContextImpl& context
}
localValuesAreCurrent
=
false
;
double
stepSize
=
integrator
.
getStepSize
();
if
(
stepSize
!=
prevStepSize
)
{
recordGlobalValue
(
stepSize
,
GlobalTarget
(
DT
,
dtVariableIndex
));
}
recordGlobalValue
(
stepSize
,
GlobalTarget
(
DT
,
dtVariableIndex
));
for
(
int
i
=
0
;
i
<
(
int
)
parameterNames
.
size
();
i
++
)
{
double
value
=
context
.
getParameter
(
parameterNames
[
i
]);
if
(
value
!=
globalValuesDouble
[
parameterVariableIndex
[
i
]])
{
...
...
@@ -7032,17 +6999,10 @@ double OpenCLIntegrateCustomStepKernel::computeKineticEnergy(ContextImpl& contex
void
OpenCLIntegrateCustomStepKernel
::
recordGlobalValue
(
double
value
,
GlobalTarget
target
)
{
switch
(
target
.
type
)
{
case
DT
:
if
(
value
!=
globalValuesDouble
[
dtVariableIndex
])
deviceGlobalsAreCurrent
=
false
;
globalValuesDouble
[
dtVariableIndex
]
=
value
;
deviceGlobalsAreCurrent
=
false
;
if
(
cl
.
getUseDoublePrecision
()
||
cl
.
getUseMixedPrecision
())
{
double
size
[]
=
{
0
,
value
};
cl
.
getIntegrationUtilities
().
getStepSize
().
upload
(
size
);
}
else
{
float
size
[]
=
{
0
,
(
float
)
value
};
cl
.
getIntegrationUtilities
().
getStepSize
().
upload
(
size
);
}
prevStepSize
=
value
;
cl
.
getIntegrationUtilities
().
setNextStepSize
(
value
);
break
;
case
VARIABLE
:
case
PARAMETER
:
...
...
platforms/opencl/src/OpenCLPlatform.cpp
View file @
5fa6fbc1
...
...
@@ -169,7 +169,7 @@ void OpenCLPlatform::contextDestroyed(ContextImpl& context) const {
}
OpenCLPlatform
::
PlatformData
::
PlatformData
(
const
System
&
system
,
const
string
&
platformPropValue
,
const
string
&
deviceIndexProperty
,
const
string
&
precisionProperty
,
const
string
&
cpuPmeProperty
)
:
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
)
{
const
string
&
precisionProperty
,
const
string
&
cpuPmeProperty
)
:
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
)
,
hasInitializedContexts
(
false
)
{
int
platformIndex
=
-
1
;
if
(
platformPropValue
.
length
()
>
0
)
stringstream
(
platformPropValue
)
>>
platformIndex
;
...
...
@@ -227,8 +227,11 @@ OpenCLPlatform::PlatformData::~PlatformData() {
}
void
OpenCLPlatform
::
PlatformData
::
initializeContexts
(
const
System
&
system
)
{
if
(
hasInitializedContexts
)
return
;
for
(
int
i
=
0
;
i
<
(
int
)
contexts
.
size
();
i
++
)
contexts
[
i
]
->
initialize
();
hasInitializedContexts
=
true
;
}
void
OpenCLPlatform
::
PlatformData
::
syncContexts
()
{
...
...
platforms/opencl/tests/TestOpenCLCompoundIntegrator.cpp
0 → 100644
View file @
5fa6fbc1
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2015 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "OpenCLTests.h"
#include "TestCompoundIntegrator.h"
void
runPlatformTests
()
{
}
serialization/include/openmm/serialization/CompoundIntegratorProxy.h
0 → 100644
View file @
5fa6fbc1
#ifndef OPENMM_COMPOUND_INTEGRATOR_PROXY_H_
#define OPENMM_COMPOUND_INTEGRATOR_PROXY_H_
#include "openmm/serialization/XmlSerializer.h"
namespace
OpenMM
{
class
CompoundIntegratorProxy
:
public
SerializationProxy
{
public:
CompoundIntegratorProxy
();
void
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
;
void
*
deserialize
(
const
SerializationNode
&
node
)
const
;
};
}
#endif
/*OPENMM_COMPOUND_INTEGRATOR_PROXY_H_*/
\ No newline at end of file
serialization/src/CompoundIntegratorProxy.cpp
0 → 100644
View file @
5fa6fbc1
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2015 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "openmm/serialization/CompoundIntegratorProxy.h"
#include <OpenMM.h>
using
namespace
std
;
using
namespace
OpenMM
;
CompoundIntegratorProxy
::
CompoundIntegratorProxy
()
:
SerializationProxy
(
"CompoundIntegrator"
)
{
}
void
CompoundIntegratorProxy
::
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
{
node
.
setIntProperty
(
"version"
,
1
);
const
CompoundIntegrator
&
integrator
=
*
reinterpret_cast
<
const
CompoundIntegrator
*>
(
object
);
node
.
setIntProperty
(
"currentIntegrator"
,
integrator
.
getCurrentIntegrator
());
for
(
int
i
=
0
;
i
<
integrator
.
getNumIntegrators
();
i
++
)
node
.
createChildNode
(
"Integrator"
,
&
integrator
.
getIntegrator
(
i
));
}
void
*
CompoundIntegratorProxy
::
deserialize
(
const
SerializationNode
&
node
)
const
{
if
(
node
.
getIntProperty
(
"version"
)
!=
1
)
throw
OpenMMException
(
"Unsupported version number"
);
CompoundIntegrator
*
integrator
=
new
CompoundIntegrator
();
for
(
int
i
=
0
;
i
<
node
.
getChildren
().
size
();
i
++
)
integrator
->
addIntegrator
(
node
.
getChildren
()[
i
].
decodeObject
<
Integrator
>
());
integrator
->
setCurrentIntegrator
(
node
.
getIntProperty
(
"currentIntegrator"
));
return
integrator
;
}
\ No newline at end of file
serialization/src/SerializationProxyRegistration.cpp
View file @
5fa6fbc1
...
...
@@ -6,7 +6,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2010-201
4
Stanford University and the Authors. *
* Portions copyright (c) 2010-201
5
Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
...
...
@@ -33,6 +33,7 @@
#include "openmm/BrownianIntegrator.h"
#include "openmm/CMAPTorsionForce.h"
#include "openmm/CMMotionRemover.h"
#include "openmm/CompoundIntegrator.h"
#include "openmm/CustomAngleForce.h"
#include "openmm/CustomBondForce.h"
#include "openmm/CustomCompoundBondForce.h"
...
...
@@ -65,6 +66,7 @@
#include "openmm/serialization/AndersenThermostatProxy.h"
#include "openmm/serialization/CMAPTorsionForceProxy.h"
#include "openmm/serialization/CMMotionRemoverProxy.h"
#include "openmm/serialization/CompoundIntegratorProxy.h"
#include "openmm/serialization/CustomAngleForceProxy.h"
#include "openmm/serialization/CustomBondForceProxy.h"
#include "openmm/serialization/CustomCompoundBondForceProxy.h"
...
...
@@ -112,6 +114,7 @@ extern "C" void registerSerializationProxies() {
SerializationProxy
::
registerProxy
(
typeid
(
BrownianIntegrator
),
new
BrownianIntegratorProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
CMAPTorsionForce
),
new
CMAPTorsionForceProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
CMMotionRemover
),
new
CMMotionRemoverProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
CompoundIntegrator
),
new
CompoundIntegratorProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
Continuous1DFunction
),
new
Continuous1DFunctionProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
Continuous2DFunction
),
new
Continuous2DFunctionProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
Continuous3DFunction
),
new
Continuous3DFunctionProxy
());
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment