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
c67aed53
Commit
c67aed53
authored
Aug 04, 2011
by
Peter Eastman
Browse files
Cleaning up the RPMD code
parent
c5e909d4
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
47 additions
and
66 deletions
+47
-66
plugins/rpmd/openmmapi/include/openmm/RPMDIntegrator.h
plugins/rpmd/openmmapi/include/openmm/RPMDIntegrator.h
+1
-1
plugins/rpmd/openmmapi/src/RPMDIntegrator.cpp
plugins/rpmd/openmmapi/src/RPMDIntegrator.cpp
+17
-1
plugins/rpmd/platforms/reference/src/ReferenceRpmdKernels.cpp
...ins/rpmd/platforms/reference/src/ReferenceRpmdKernels.cpp
+28
-62
plugins/rpmd/platforms/reference/src/ReferenceRpmdKernels.h
plugins/rpmd/platforms/reference/src/ReferenceRpmdKernels.h
+1
-2
No files found.
plugins/rpmd/openmmapi/include/openmm/RPMDIntegrator.h
View file @
c67aed53
...
...
@@ -168,7 +168,7 @@ protected:
private:
double
temperature
,
friction
;
int
numCopies
,
randomNumberSeed
;
bool
forcesAreValid
;
bool
forcesAreValid
,
hasSetPosition
,
hasSetVelocity
;
ContextImpl
*
context
;
Context
*
owner
;
Kernel
kernel
;
...
...
plugins/rpmd/openmmapi/src/RPMDIntegrator.cpp
View file @
c67aed53
...
...
@@ -42,7 +42,7 @@ using std::string;
using
std
::
vector
;
RPMDIntegrator
::
RPMDIntegrator
(
int
numCopies
,
double
temperature
,
double
frictionCoeff
,
double
stepSize
)
:
owner
(
NULL
),
numCopies
(
numCopies
),
forcesAreValid
(
false
)
{
owner
(
NULL
),
numCopies
(
numCopies
),
forcesAreValid
(
false
)
,
hasSetPosition
(
false
),
hasSetVelocity
(
false
)
{
setTemperature
(
temperature
);
setFriction
(
frictionCoeff
);
setStepSize
(
stepSize
);
...
...
@@ -71,10 +71,12 @@ vector<string> RPMDIntegrator::getKernelNames() {
void
RPMDIntegrator
::
setPositions
(
int
copy
,
const
vector
<
Vec3
>&
positions
)
{
dynamic_cast
<
IntegrateRPMDStepKernel
&>
(
kernel
.
getImpl
()).
setPositions
(
copy
,
positions
);
hasSetPosition
=
true
;
}
void
RPMDIntegrator
::
setVelocities
(
int
copy
,
const
vector
<
Vec3
>&
velocities
)
{
dynamic_cast
<
IntegrateRPMDStepKernel
&>
(
kernel
.
getImpl
()).
setVelocities
(
copy
,
velocities
);
hasSetVelocity
=
true
;
}
State
RPMDIntegrator
::
getState
(
int
copy
,
int
types
)
{
...
...
@@ -83,6 +85,20 @@ State RPMDIntegrator::getState(int copy, int types) {
}
void
RPMDIntegrator
::
step
(
int
steps
)
{
if
(
!
hasSetPosition
)
{
// Initialize the positions from the context.
State
s
=
context
->
getOwner
().
getState
(
State
::
Positions
);
for
(
int
i
=
0
;
i
<
numCopies
;
i
++
)
setPositions
(
i
,
s
.
getPositions
());
}
if
(
!
hasSetVelocity
)
{
// Initialize the velocities from the context.
State
s
=
context
->
getOwner
().
getState
(
State
::
Velocities
);
for
(
int
i
=
0
;
i
<
numCopies
;
i
++
)
setVelocities
(
i
,
s
.
getVelocities
());
}
for
(
int
i
=
0
;
i
<
steps
;
++
i
)
{
dynamic_cast
<
IntegrateRPMDStepKernel
&>
(
kernel
.
getImpl
()).
execute
(
*
context
,
*
this
,
forcesAreValid
);
forcesAreValid
=
true
;
...
...
plugins/rpmd/platforms/reference/src/ReferenceRpmdKernels.cpp
View file @
c67aed53
...
...
@@ -79,22 +79,6 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
vector
<
RealVec
>&
pos
=
extractPositions
(
context
);
vector
<
RealVec
>&
vel
=
extractVelocities
(
context
);
vector
<
RealVec
>&
f
=
extractForces
(
context
);
if
(
!
hasSetPosition
)
{
// Initialize the positions from the context.
for
(
int
i
=
0
;
i
<
numCopies
;
i
++
)
for
(
int
j
=
0
;
j
<
numParticles
;
j
++
)
positions
[
i
][
j
]
=
pos
[
j
];
hasSetPosition
=
true
;
}
if
(
!
hasSetVelocity
)
{
// Initialize the velocities from the context.
for
(
int
i
=
0
;
i
<
numCopies
;
i
++
)
for
(
int
j
=
0
;
j
<
numParticles
;
j
++
)
velocities
[
i
][
j
]
=
vel
[
j
];
hasSetVelocity
=
true
;
}
// Loop over copies and compute the force on each one.
...
...
@@ -109,24 +93,24 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
// Apply the PILE-L thermostat.
vector
<
t_complex
>
p
(
numCopies
);
vector
<
t_complex
>
v
(
numCopies
);
vector
<
t_complex
>
q
(
numCopies
);
const
RealOpenMM
hbar
=
1.054571628e-34
*
AVOGADRO
/
(
1000
*
1e-12
);
const
RealOpenMM
scale
=
1.0
/
sqrt
(
numCopies
);
const
RealOpenMM
scale
=
1.0
/
sqrt
(
(
RealOpenMM
)
numCopies
);
const
RealOpenMM
nkT
=
numCopies
*
BOLTZ
*
integrator
.
getTemperature
();
const
RealOpenMM
twown
=
2.0
*
nkT
/
hbar
;
const
RealOpenMM
c1_0
=
exp
(
-
halfdt
*
integrator
.
getFriction
());
const
RealOpenMM
c2_0
=
sqrt
(
1.0
-
c1_0
*
c1_0
);
for
(
int
particle
=
0
;
particle
<
numParticles
;
particle
++
)
{
const
RealOpenMM
c3_0
=
c2_0
*
sqrt
(
system
.
getParticleMass
(
particle
)
*
nkT
);
const
RealOpenMM
c3_0
=
c2_0
*
sqrt
(
nkT
/
system
.
getParticleMass
(
particle
));
for
(
int
component
=
0
;
component
<
3
;
component
++
)
{
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
p
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
]
*
system
.
getParticleMass
(
particle
)
,
0.0
);
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
p
[
0
],
&
p
[
0
]);
v
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
],
0.0
);
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
v
[
0
],
&
v
[
0
]);
// Apply a local Langevin thermostat to the centroid mode.
p
[
0
].
re
=
p
[
0
].
re
*
c1_0
+
c3_0
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
v
[
0
].
re
=
v
[
0
].
re
*
c1_0
+
c3_0
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
// Use critical damping white noise for the remaining modes.
...
...
@@ -135,16 +119,16 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
const
RealOpenMM
wk
=
twown
*
sin
(
k
*
M_PI
/
numCopies
);
const
RealOpenMM
c1
=
exp
(
-
2.0
*
wk
*
halfdt
);
const
RealOpenMM
c2
=
sqrt
((
1.0
-
c1
*
c1
)
/
2
)
*
(
isCenter
?
sqrt
(
2.0
)
:
1.0
);
const
RealOpenMM
c3
=
c2
*
sqrt
(
system
.
getParticleMass
(
particle
)
*
nkT
);
const
RealOpenMM
c3
=
c2
*
sqrt
(
nkT
/
system
.
getParticleMass
(
particle
));
RealOpenMM
rand1
=
c3
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
RealOpenMM
rand2
=
(
isCenter
?
0.0
:
c3
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
());
p
[
k
]
=
p
[
k
]
*
c1
+
t_complex
(
rand1
,
rand2
);
v
[
k
]
=
v
[
k
]
*
c1
+
t_complex
(
rand1
,
rand2
);
if
(
k
<
numCopies
-
k
)
p
[
numCopies
-
k
]
=
p
[
numCopies
-
k
]
*
c1
+
t_complex
(
rand1
,
-
rand2
);
v
[
numCopies
-
k
]
=
v
[
numCopies
-
k
]
*
c1
+
t_complex
(
rand1
,
-
rand2
);
}
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
p
[
0
],
&
p
[
0
]);
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
v
[
0
],
&
v
[
0
]);
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
velocities
[
k
][
particle
][
component
]
=
scale
*
p
[
k
].
re
/
system
.
getParticleMass
(
particle
)
;
velocities
[
k
][
particle
][
component
]
=
scale
*
v
[
k
].
re
;
}
}
...
...
@@ -160,26 +144,26 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
for
(
int
component
=
0
;
component
<
3
;
component
++
)
{
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
{
q
[
k
]
=
t_complex
(
scale
*
positions
[
k
][
particle
][
component
],
0.0
);
p
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
]
*
system
.
getParticleMass
(
particle
)
,
0.0
);
v
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
],
0.0
);
}
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
q
[
0
],
&
q
[
0
]);
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
p
[
0
],
&
p
[
0
]);
q
[
0
]
+=
p
[
0
]
*
(
dt
/
system
.
getParticleMass
(
particle
))
;
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
v
[
0
],
&
v
[
0
]);
q
[
0
]
+=
v
[
0
]
*
dt
;
for
(
int
k
=
1
;
k
<
numCopies
;
k
++
)
{
const
RealOpenMM
wk
=
twown
*
sin
(
k
*
M_PI
/
numCopies
);
const
RealOpenMM
wt
=
wk
*
dt
;
const
RealOpenMM
coswt
=
cos
(
wt
);
const
RealOpenMM
sinwt
=
sin
(
wt
);
const
RealOpenMM
wm
=
wk
*
system
.
getParticleMass
(
particle
);
const
t_complex
p
prime
=
p
[
k
]
*
coswt
-
q
[
k
]
*
(
w
m
*
sinwt
);
// Advance
momentum
from t to t+dt
q
[
k
]
=
p
[
k
]
*
(
sinwt
/
w
m
)
+
q
[
k
]
*
coswt
;
// Advance position from t to t+dt
p
[
k
]
=
p
prime
;
const
t_complex
v
prime
=
v
[
k
]
*
coswt
-
q
[
k
]
*
(
w
k
*
sinwt
);
// Advance
velocity
from t to t+dt
q
[
k
]
=
v
[
k
]
*
(
sinwt
/
w
k
)
+
q
[
k
]
*
coswt
;
// Advance position from t to t+dt
v
[
k
]
=
v
prime
;
}
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
q
[
0
],
&
q
[
0
]);
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
p
[
0
],
&
p
[
0
]);
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
v
[
0
],
&
v
[
0
]);
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
{
positions
[
k
][
particle
][
component
]
=
scale
*
q
[
k
].
re
;
velocities
[
k
][
particle
][
component
]
=
scale
*
p
[
k
].
re
/
system
.
getParticleMass
(
particle
)
;
velocities
[
k
][
particle
][
component
]
=
scale
*
v
[
k
].
re
;
}
}
}
...
...
@@ -206,15 +190,15 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
// Apply the PILE-L thermostat again.
for
(
int
particle
=
0
;
particle
<
numParticles
;
particle
++
)
{
const
RealOpenMM
c3_0
=
c2_0
*
sqrt
(
system
.
getParticleMass
(
particle
)
*
nkT
);
const
RealOpenMM
c3_0
=
c2_0
*
sqrt
(
nkT
/
system
.
getParticleMass
(
particle
));
for
(
int
component
=
0
;
component
<
3
;
component
++
)
{
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
p
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
]
*
system
.
getParticleMass
(
particle
)
,
0.0
);
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
p
[
0
],
&
p
[
0
]);
v
[
k
]
=
t_complex
(
scale
*
velocities
[
k
][
particle
][
component
],
0.0
);
fftpack_exec_1d
(
fft
,
FFTPACK_FORWARD
,
&
v
[
0
],
&
v
[
0
]);
// Apply a local Langevin thermostat to the centroid mode.
p
[
0
].
re
=
p
[
0
].
re
*
c1_0
+
c3_0
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
v
[
0
].
re
=
v
[
0
].
re
*
c1_0
+
c3_0
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
// Use critical damping white noise for the remaining modes.
...
...
@@ -223,16 +207,16 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
const
RealOpenMM
wk
=
twown
*
sin
(
k
*
M_PI
/
numCopies
);
const
RealOpenMM
c1
=
exp
(
-
2.0
*
wk
*
halfdt
);
const
RealOpenMM
c2
=
sqrt
((
1.0
-
c1
*
c1
)
/
2
)
*
(
isCenter
?
sqrt
(
2.0
)
:
1.0
);
const
RealOpenMM
c3
=
c2
*
sqrt
(
system
.
getParticleMass
(
particle
)
*
nkT
);
const
RealOpenMM
c3
=
c2
*
sqrt
(
nkT
/
system
.
getParticleMass
(
particle
));
RealOpenMM
rand1
=
c3
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
RealOpenMM
rand2
=
(
isCenter
?
0.0
:
c3
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
());
p
[
k
]
=
p
[
k
]
*
c1
+
t_complex
(
rand1
,
rand2
);
v
[
k
]
=
v
[
k
]
*
c1
+
t_complex
(
rand1
,
rand2
);
if
(
k
<
numCopies
-
k
)
p
[
numCopies
-
k
]
=
p
[
numCopies
-
k
]
*
c1
+
t_complex
(
rand1
,
-
rand2
);
v
[
numCopies
-
k
]
=
v
[
numCopies
-
k
]
*
c1
+
t_complex
(
rand1
,
-
rand2
);
}
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
p
[
0
],
&
p
[
0
]);
fftpack_exec_1d
(
fft
,
FFTPACK_BACKWARD
,
&
v
[
0
],
&
v
[
0
]);
for
(
int
k
=
0
;
k
<
numCopies
;
k
++
)
velocities
[
k
][
particle
][
component
]
=
scale
*
p
[
k
].
re
/
system
.
getParticleMass
(
particle
)
;
velocities
[
k
][
particle
][
component
]
=
scale
*
v
[
k
].
re
;
}
}
...
...
@@ -247,22 +231,6 @@ void ReferenceIntegrateRPMDStepKernel::execute(ContextImpl& context, const RPMDI
// vector<RealVec>& pos = extractPositions(context);
// vector<RealVec>& vel = extractVelocities(context);
// vector<RealVec>& f = extractForces(context);
// if (!hasSetPosition) {
// // Initialize the positions from the context.
//
// for (int i = 0; i < numCopies; i++)
// for (int j = 0; j < numParticles; j++)
// positions[i][j] = pos[j];
// hasSetPosition = true;
// }
// if (!hasSetVelocity) {
// // Initialize the velocities from the context.
//
// for (int i = 0; i < numCopies; i++)
// for (int j = 0; j < numParticles; j++)
// velocities[i][j] = vel[j];
// hasSetVelocity = true;
// }
//
// // Loop over copies and compute the force on each one.
//
...
...
@@ -356,14 +324,12 @@ void ReferenceIntegrateRPMDStepKernel::setPositions(int copy, const vector<Vec3>
int
numParticles
=
positions
[
copy
].
size
();
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
positions
[
copy
][
i
]
=
pos
[
i
];
hasSetPosition
=
true
;
}
void
ReferenceIntegrateRPMDStepKernel
::
setVelocities
(
int
copy
,
const
vector
<
Vec3
>&
vel
)
{
int
numParticles
=
velocities
[
copy
].
size
();
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
velocities
[
copy
][
i
]
=
vel
[
i
];
hasSetVelocity
=
true
;
}
void
ReferenceIntegrateRPMDStepKernel
::
copyToContext
(
int
copy
,
ContextImpl
&
context
)
const
{
...
...
plugins/rpmd/platforms/reference/src/ReferenceRpmdKernels.h
View file @
c67aed53
...
...
@@ -46,7 +46,7 @@ namespace OpenMM {
class
ReferenceIntegrateRPMDStepKernel
:
public
IntegrateRPMDStepKernel
{
public:
ReferenceIntegrateRPMDStepKernel
(
std
::
string
name
,
const
Platform
&
platform
)
:
IntegrateRPMDStepKernel
(
name
,
platform
),
fft
(
NULL
)
,
hasSetPosition
(
false
),
hasSetVelocity
(
false
)
{
IntegrateRPMDStepKernel
(
name
,
platform
),
fft
(
NULL
)
{
}
~
ReferenceIntegrateRPMDStepKernel
();
/**
...
...
@@ -82,7 +82,6 @@ private:
std
::
vector
<
std
::
vector
<
RealVec
>
>
velocities
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
forces
;
fftpack
*
fft
;
bool
hasSetPosition
,
hasSetVelocity
;
};
}
// namespace OpenMM
...
...
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