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
873552ba
Commit
873552ba
authored
Nov 16, 2012
by
Peter Eastman
Browse files
Deleted free energy plugin
parent
c775bd19
Changes
81
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
0 additions
and
5884 deletions
+0
-5884
plugins/freeEnergy/platforms/reference/src/gbsa/GBVISoftcoreParameters.cpp
...y/platforms/reference/src/gbsa/GBVISoftcoreParameters.cpp
+0
-474
plugins/freeEnergy/platforms/reference/src/gbsa/GBVISoftcoreParameters.h
...rgy/platforms/reference/src/gbsa/GBVISoftcoreParameters.h
+0
-362
plugins/freeEnergy/platforms/reference/src/gbsa/ObcSoftcoreParameters.cpp
...gy/platforms/reference/src/gbsa/ObcSoftcoreParameters.cpp
+0
-457
plugins/freeEnergy/platforms/reference/src/gbsa/ObcSoftcoreParameters.h
...ergy/platforms/reference/src/gbsa/ObcSoftcoreParameters.h
+0
-375
plugins/freeEnergy/platforms/reference/tests/CMakeLists.txt
plugins/freeEnergy/platforms/reference/tests/CMakeLists.txt
+0
-60
plugins/freeEnergy/platforms/reference/tests/TestReferenceGBVISoftcoreForce.cpp
...tforms/reference/tests/TestReferenceGBVISoftcoreForce.cpp
+0
-907
plugins/freeEnergy/platforms/reference/tests/TestReferenceLJSoftcoreForce.cpp
...latforms/reference/tests/TestReferenceLJSoftcoreForce.cpp
+0
-290
plugins/freeEnergy/platforms/reference/tests/TestReferenceOBCSoftcoreForce.cpp
...atforms/reference/tests/TestReferenceOBCSoftcoreForce.cpp
+0
-181
plugins/freeEnergy/platforms/reference/tests/TestReferenceSoftcoreForce.h
...gy/platforms/reference/tests/TestReferenceSoftcoreForce.h
+0
-1966
plugins/freeEnergy/serialization/CMakeLists.txt
plugins/freeEnergy/serialization/CMakeLists.txt
+0
-87
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyGBSAOBCSoftcoreForceProxy.h
...penmm/serialization/FreeEnergyGBSAOBCSoftcoreForceProxy.h
+0
-53
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyGBVISoftcoreForceProxy.h
...e/openmm/serialization/FreeEnergyGBVISoftcoreForceProxy.h
+0
-53
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyNonbondedSoftcoreForceProxy.h
...nmm/serialization/FreeEnergyNonbondedSoftcoreForceProxy.h
+0
-53
plugins/freeEnergy/serialization/src/FreeEnergyGBSAOBCSoftcoreProxy.cpp
...ergy/serialization/src/FreeEnergyGBSAOBCSoftcoreProxy.cpp
+0
-81
plugins/freeEnergy/serialization/src/FreeEnergyGBVISoftcoreProxy.cpp
...eEnergy/serialization/src/FreeEnergyGBVISoftcoreProxy.cpp
+0
-96
plugins/freeEnergy/serialization/src/FreeEnergyNonbondedSoftcoreForceProxy.cpp
...rialization/src/FreeEnergyNonbondedSoftcoreForceProxy.cpp
+0
-92
plugins/freeEnergy/serialization/src/FreeEnergySerializationProxyRegistration.cpp
...lization/src/FreeEnergySerializationProxyRegistration.cpp
+0
-70
plugins/freeEnergy/serialization/tests/CMakeLists.txt
plugins/freeEnergy/serialization/tests/CMakeLists.txt
+0
-17
plugins/freeEnergy/serialization/tests/TestSerializeFreeEnergyGBSAOBCSoftcoreForce.cpp
...ion/tests/TestSerializeFreeEnergyGBSAOBCSoftcoreForce.cpp
+0
-92
plugins/freeEnergy/serialization/tests/TestSerializeFreeEnergyGBVISoftcoreForce.cpp
...zation/tests/TestSerializeFreeEnergyGBVISoftcoreForce.cpp
+0
-118
No files found.
plugins/freeEnergy/platforms/reference/src/gbsa/GBVISoftcoreParameters.cpp
deleted
100644 → 0
View file @
c775bd19
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
* Contributors: Pande Group
*
* 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 <math.h>
#include <iostream>
#include <sstream>
#include <string.h>
#include "openmm/OpenMMException.h"
#include "GBVISoftcoreParameters.h"
#include "../SimTKUtilities/SimTKOpenMMCommon.h"
#include "../SimTKUtilities/SimTKOpenMMLog.h"
#include "../SimTKUtilities/SimTKOpenMMUtilities.h"
/**---------------------------------------------------------------------------------------
GBVISoftcoreParameters constructor (Simbios)
@param numberOfAtoms number of atoms
--------------------------------------------------------------------------------------- */
GBVISoftcoreParameters
::
GBVISoftcoreParameters
(
int
numberOfAtoms
)
:
_numberOfAtoms
(
numberOfAtoms
),
_soluteDielectric
(
1.0
),
_solventDielectric
(
78.3
),
_electricConstant
(
-
0.5
*
ONE_4PI_EPS0
),
_quinticLowerLimitFactor
(
0.8
),
_bornRadiusScalingSoftcoreMethod
(
NoScaling
),
_cutoff
(
false
),
_periodic
(
false
)
{
// ---------------------------------------------------------------------------------------
_atomicRadii
.
resize
(
numberOfAtoms
);
_scaledRadii
.
resize
(
numberOfAtoms
);
_gammaParameters
.
resize
(
numberOfAtoms
);
_bornRadiusScaleFactors
.
resize
(
numberOfAtoms
);
setQuinticUpperBornRadiusLimit
(
static_cast
<
RealOpenMM
>
(
5.0
)
);
}
/**---------------------------------------------------------------------------------------
GBVISoftcoreParameters destructor
--------------------------------------------------------------------------------------- */
GBVISoftcoreParameters
::~
GBVISoftcoreParameters
(
){
}
/**---------------------------------------------------------------------------------------
Get number of atoms
@return number of atoms
--------------------------------------------------------------------------------------- */
int
GBVISoftcoreParameters
::
getNumberOfAtoms
(
void
)
const
{
return
_numberOfAtoms
;
}
/**---------------------------------------------------------------------------------------
Get electric constant
@return electric constant
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getElectricConstant
(
void
)
const
{
return
_electricConstant
;
}
/**---------------------------------------------------------------------------------------
Get solvent dielectric
@return solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getSolventDielectric
(
void
)
const
{
return
_solventDielectric
;
}
/**---------------------------------------------------------------------------------------
Set solvent dielectric
@param solventDielectric solvent dielectric
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setSolventDielectric
(
RealOpenMM
solventDielectric
){
_solventDielectric
=
solventDielectric
;
}
/**---------------------------------------------------------------------------------------
Get solute dielectric
@return soluteDielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getSoluteDielectric
(
void
)
const
{
return
_soluteDielectric
;
}
/**---------------------------------------------------------------------------------------
Set solute dielectric
@param soluteDielectric solute dielectric
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setSoluteDielectric
(
RealOpenMM
soluteDielectric
){
_soluteDielectric
=
soluteDielectric
;
}
/**---------------------------------------------------------------------------------------
Get the quintic spline lower limit factor
@return quintic spline lower limit factor
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getQuinticLowerLimitFactor
(
void
)
const
{
return
_quinticLowerLimitFactor
;
}
/**---------------------------------------------------------------------------------------
Set the quintic spline lower limit factor
@param quintic spline lower limit factor
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setQuinticLowerLimitFactor
(
RealOpenMM
quinticLowerLimitFactor
){
_quinticLowerLimitFactor
=
quinticLowerLimitFactor
;
}
/**---------------------------------------------------------------------------------------
Get the quintic spline upper limit
@return quintic spline upper limit
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getQuinticUpperBornRadiusLimit
(
void
)
const
{
return
_quinticUpperBornRadiusLimit
;
}
/**---------------------------------------------------------------------------------------
Set the quintic spline upper limit
@param quintic spline upper limit
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setQuinticUpperBornRadiusLimit
(
RealOpenMM
quinticUpperBornRadiusLimit
){
_quinticUpperBornRadiusLimit
=
quinticUpperBornRadiusLimit
;
_quinticUpperSplineLimit
=
POW
(
_quinticUpperBornRadiusLimit
,
static_cast
<
RealOpenMM
>
(
-
3.0
)
);
}
/**---------------------------------------------------------------------------------------
Get the quintic upper spline limit
@return the quintic upper spline limit
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getQuinticUpperSplineLimit
(
void
)
const
{
return
_quinticUpperSplineLimit
;
}
/**---------------------------------------------------------------------------------------
Get AtomicRadii array
@return array of atomic radii
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
GBVISoftcoreParameters
::
getAtomicRadii
(
void
)
const
{
return
_atomicRadii
;
}
/**---------------------------------------------------------------------------------------
Set AtomicRadii vector
@param atomicRadii vector of atomic radii
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setAtomicRadii
(
const
RealOpenMMVector
&
atomicRadii
){
// ---------------------------------------------------------------------------------------
if
(
atomicRadii
.
size
()
==
_atomicRadii
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
atomicRadii
.
size
();
ii
++
){
_atomicRadii
[
ii
]
=
atomicRadii
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreParameters: input size for atomic radii does not agree w/ current size: input="
;
msg
<<
atomicRadii
.
size
();
msg
<<
" current size="
<<
_atomicRadii
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Return scaled radii
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
GBVISoftcoreParameters
::
getScaledRadii
(
void
)
const
{
return
_scaledRadii
;
}
/**---------------------------------------------------------------------------------------
Set scaled radii
@param scaledRadii scaledRadii
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setScaledRadii
(
const
RealOpenMMVector
&
scaledRadii
){
// ---------------------------------------------------------------------------------------
if
(
scaledRadii
.
size
()
==
_scaledRadii
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
scaledRadii
.
size
();
ii
++
){
_scaledRadii
[
ii
]
=
scaledRadii
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreParameters: input size for scaled radii does not agree w/ current size: input="
;
msg
<<
scaledRadii
.
size
();
msg
<<
" current size="
<<
_scaledRadii
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Return gamma parameters
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
GBVISoftcoreParameters
::
getGammaParameters
(
void
)
const
{
return
_gammaParameters
;
}
/**---------------------------------------------------------------------------------------
Set gamma parameters
@param gammas gammas
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setGammaParameters
(
const
RealOpenMMVector
&
gammas
){
// ---------------------------------------------------------------------------------------
if
(
gammas
.
size
()
==
_gammaParameters
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
gammas
.
size
();
ii
++
){
_gammaParameters
[
ii
]
=
gammas
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreParameters: input size for gammas does not agree w/ current size: input="
;
msg
<<
gammas
.
size
();
msg
<<
" current size="
<<
_gammaParameters
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Return BornRadiusScaleFactors
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
GBVISoftcoreParameters
::
getBornRadiusScaleFactors
(
void
)
const
{
return
_bornRadiusScaleFactors
;
}
/**---------------------------------------------------------------------------------------
Set bornRadiusScaleFactors parameters
@param bornRadiusScaleFactors bornRadiusScaleFactors
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setBornRadiusScaleFactors
(
const
RealOpenMMVector
&
bornRadiusScaleFactors
){
// ---------------------------------------------------------------------------------------
if
(
bornRadiusScaleFactors
.
size
()
==
_bornRadiusScaleFactors
.
size
()
){
for
(
int
ii
=
0
;
ii
<
(
int
)
bornRadiusScaleFactors
.
size
();
ii
++
){
_bornRadiusScaleFactors
[
ii
]
=
bornRadiusScaleFactors
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreParameters: input size for bornRadiusScaleFactors does not agree w/ current size: input="
;
msg
<<
bornRadiusScaleFactors
.
size
();
msg
<<
" current size="
<<
_bornRadiusScaleFactors
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Set the force to use a cutoff.
@param distance the cutoff distance
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setUseCutoff
(
RealOpenMM
distance
)
{
_cutoff
=
true
;
_cutoffDistance
=
distance
;
}
/**---------------------------------------------------------------------------------------
Get whether to use a cutoff.
--------------------------------------------------------------------------------------- */
bool
GBVISoftcoreParameters
::
getUseCutoff
()
{
return
_cutoff
;
}
/**---------------------------------------------------------------------------------------
Get the cutoff distance.
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getCutoffDistance
()
{
return
_cutoffDistance
;
}
/**---------------------------------------------------------------------------------------
Set the force to use periodic boundary conditions. This requires that a cutoff has
also been set, and the smallest side of the periodic box is at least twice the cutoff
distance.
@param boxSize the X, Y, and Z widths of the periodic box
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setPeriodic
(
RealOpenMM
*
boxSize
)
{
assert
(
_cutoff
);
assert
(
boxSize
[
0
]
>=
2.0
*
_cutoffDistance
);
assert
(
boxSize
[
1
]
>=
2.0
*
_cutoffDistance
);
assert
(
boxSize
[
2
]
>=
2.0
*
_cutoffDistance
);
_periodic
=
true
;
_periodicBoxSize
[
0
]
=
boxSize
[
0
];
_periodicBoxSize
[
1
]
=
boxSize
[
1
];
_periodicBoxSize
[
2
]
=
boxSize
[
2
];
}
/**---------------------------------------------------------------------------------------
Get whether to use periodic boundary conditions.
--------------------------------------------------------------------------------------- */
bool
GBVISoftcoreParameters
::
getPeriodic
()
{
return
_periodic
;
}
/**---------------------------------------------------------------------------------------
Get the periodic box dimension
--------------------------------------------------------------------------------------- */
const
RealOpenMM
*
GBVISoftcoreParameters
::
getPeriodicBox
()
{
return
_periodicBoxSize
;
}
/**---------------------------------------------------------------------------------------
Get tau prefactor
@return (1/e1 - 1/e0), where e1 = solute dielectric, e0 = solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
GBVISoftcoreParameters
::
getTau
(
void
)
const
{
// ---------------------------------------------------------------------------------------
static
const
RealOpenMM
zero
=
0.0
;
static
const
RealOpenMM
one
=
1.0
;
// ---------------------------------------------------------------------------------------
RealOpenMM
tau
;
if
(
getSoluteDielectric
()
!=
zero
&&
getSolventDielectric
()
!=
zero
){
tau
=
(
one
/
getSoluteDielectric
())
-
(
one
/
getSolventDielectric
());
}
else
{
tau
=
zero
;
}
return
tau
;
}
/**---------------------------------------------------------------------------------------
Get Born radii switching function method
@return method
--------------------------------------------------------------------------------------- */
GBVISoftcoreParameters
::
BornRadiusScalingSoftcoreMethod
GBVISoftcoreParameters
::
getBornRadiusScalingSoftcoreMethod
(
void
)
const
{
return
_bornRadiusScalingSoftcoreMethod
;
}
/**---------------------------------------------------------------------------------------
Set Born radii switching function method
@param method
--------------------------------------------------------------------------------------- */
void
GBVISoftcoreParameters
::
setBornRadiusScalingSoftcoreMethod
(
BornRadiusScalingSoftcoreMethod
bornRadiusScalingSoftcoreMethod
){
_bornRadiusScalingSoftcoreMethod
=
bornRadiusScalingSoftcoreMethod
;
}
plugins/freeEnergy/platforms/reference/src/gbsa/GBVISoftcoreParameters.h
deleted
100755 → 0
View file @
c775bd19
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
* Contributors: Pande Group
*
* 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.
*/
#ifndef __GBVISoftcoreParameters_H__
#define __GBVISoftcoreParameters_H__
#include "SimTKUtilities/SimTKOpenMMCommon.h"
// ---------------------------------------------------------------------------------------
class
GBVISoftcoreParameters
{
public:
/**
* This is an enumeration of the different methods that may be used for scaling of the Born radii.
*/
enum
BornRadiusScalingSoftcoreMethod
{
/**
* No scaling method is applied.
*/
NoScaling
=
0
,
/**
* Use quintic spline scaling function
*/
QuinticSpline
=
1
};
private:
int
_numberOfAtoms
;
// parameters:
// scaled radii
// gamma parameters
// BornRadiusScaleFactors parameters
RealOpenMMVector
_scaledRadii
;
RealOpenMMVector
_atomicRadii
;
RealOpenMMVector
_gammaParameters
;
RealOpenMMVector
_bornRadiusScaleFactors
;
RealOpenMM
_solventDielectric
;
RealOpenMM
_soluteDielectric
;
RealOpenMM
_electricConstant
;
// cutoff and periodic boundary conditions
bool
_cutoff
;
bool
_periodic
;
RealOpenMM
_periodicBoxSize
[
3
];
RealOpenMM
_cutoffDistance
;
// Born radii switching function params
BornRadiusScalingSoftcoreMethod
_bornRadiusScalingSoftcoreMethod
;
RealOpenMM
_quinticLowerLimitFactor
;
RealOpenMM
_quinticUpperBornRadiusLimit
;
RealOpenMM
_quinticUpperSplineLimit
;
public:
/**---------------------------------------------------------------------------------------
GBVISoftcoreParameters constructor (Simbios)
@param numberOfAtoms number of atoms
--------------------------------------------------------------------------------------- */
GBVISoftcoreParameters
(
int
numberOfAtoms
);
/**---------------------------------------------------------------------------------------
GBVISoftcoreParameters destructor (Simbios)
--------------------------------------------------------------------------------------- */
~
GBVISoftcoreParameters
(
);
/**---------------------------------------------------------------------------------------
Get number of atoms
@return number of atoms
--------------------------------------------------------------------------------------- */
int
getNumberOfAtoms
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get electric constant
@return electric constant
--------------------------------------------------------------------------------------- */
RealOpenMM
getElectricConstant
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get solvent dielectric
@return solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
getSolventDielectric
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set solvent dielectric
@param solventDielectric solvent dielectric
--------------------------------------------------------------------------------------- */
void
setSolventDielectric
(
RealOpenMM
solventDielectric
);
/**---------------------------------------------------------------------------------------
Get solute dielectric
@return soluteDielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
getSoluteDielectric
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set solute dielectric
@param soluteDielectric solute dielectric
--------------------------------------------------------------------------------------- */
void
setSoluteDielectric
(
RealOpenMM
soluteDielectric
);
/**---------------------------------------------------------------------------------------
Return scaled radii
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getScaledRadii
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set scaled radii
@param vector of scaled radii
--------------------------------------------------------------------------------------- */
void
setScaledRadii
(
const
RealOpenMMVector
&
radii
);
/**---------------------------------------------------------------------------------------
Get AtomicRadii array w/ dielectric offset applied
@return array of atom volumes
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getAtomicRadii
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set AtomicRadii array
@param atomicRadii vector of atomic radii
--------------------------------------------------------------------------------------- */
void
setAtomicRadii
(
const
RealOpenMMVector
&
atomicRadii
);
/**---------------------------------------------------------------------------------------
Get GammaParameters array
@return array of gamma values
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getGammaParameters
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set GammaParameters array
@param gammaParameters array of gamma parameters
--------------------------------------------------------------------------------------- */
void
setGammaParameters
(
const
RealOpenMMVector
&
gammaParameters
);
/**---------------------------------------------------------------------------------------
Get BornRadiusScaleFactors array
@return array of bornRadiusScaleFactor values
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getBornRadiusScaleFactors
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set BornRadiusScaleFactors array
@param bornRadiusScaleFactors array of bornRadiusScaleFactor parameters
--------------------------------------------------------------------------------------- */
void
setBornRadiusScaleFactors
(
const
RealOpenMMVector
&
bornRadiusScaleFactors
);
/**---------------------------------------------------------------------------------------
Set the force to use a cutoff.
@param distance the cutoff distance
--------------------------------------------------------------------------------------- */
void
setUseCutoff
(
RealOpenMM
distance
);
/**---------------------------------------------------------------------------------------
Get whether to use a cutoff.
--------------------------------------------------------------------------------------- */
bool
getUseCutoff
(
void
);
/**---------------------------------------------------------------------------------------
Get the cutoff distance.
--------------------------------------------------------------------------------------- */
RealOpenMM
getCutoffDistance
(
void
);
/**---------------------------------------------------------------------------------------
Set the force to use periodic boundary conditions. This requires that a cutoff has
already been set, and the smallest side of the periodic box is at least twice the cutoff
distance.
@param boxSize the X, Y, and Z widths of the periodic box
--------------------------------------------------------------------------------------- */
void
setPeriodic
(
RealOpenMM
*
boxSize
);
/**---------------------------------------------------------------------------------------
Get whether to use periodic boundary conditions.
--------------------------------------------------------------------------------------- */
bool
getPeriodic
(
void
);
/**---------------------------------------------------------------------------------------
Get the periodic box dimension
--------------------------------------------------------------------------------------- */
const
RealOpenMM
*
getPeriodicBox
(
void
);
/**---------------------------------------------------------------------------------------
Get the quintic spline lower limit factor
--------------------------------------------------------------------------------------- */
RealOpenMM
getQuinticLowerLimitFactor
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set the quintic spline lower limit factor
--------------------------------------------------------------------------------------- */
void
setQuinticLowerLimitFactor
(
RealOpenMM
quinticLowerLimitFactor
);
/**---------------------------------------------------------------------------------------
Get the quintic spline upper limit
--------------------------------------------------------------------------------------- */
RealOpenMM
getQuinticUpperBornRadiusLimit
(
void
)
const
;
RealOpenMM
getQuinticUpperSplineLimit
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set the quintic spline upper limit
--------------------------------------------------------------------------------------- */
void
setQuinticUpperBornRadiusLimit
(
RealOpenMM
quinticUpperBornRadiusLimit
);
/**---------------------------------------------------------------------------------------
Get tau prefactor
@return (1/e1 - 1/e0), where e1 = solute dielectric, e0 = solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
getTau
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get BornRadiusScalingSoftcoreMethod
@return scaling method
--------------------------------------------------------------------------------------- */
BornRadiusScalingSoftcoreMethod
getBornRadiusScalingSoftcoreMethod
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set BornRadiusScalingSoftcoreMethod
@param scaling method
--------------------------------------------------------------------------------------- */
void
setBornRadiusScalingSoftcoreMethod
(
BornRadiusScalingSoftcoreMethod
method
);
};
#endif // __GBVISoftcoreParameters_H__
plugins/freeEnergy/platforms/reference/src/gbsa/ObcSoftcoreParameters.cpp
deleted
100644 → 0
View file @
c775bd19
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
* Contributors: Pande Group
*
* 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 <math.h>
#include <string.h>
#include <sstream>
#include "openmm/OpenMMException.h"
#include "ObcSoftcoreParameters.h"
#include "../SimTKUtilities/SimTKOpenMMCommon.h"
/**---------------------------------------------------------------------------------------
ObcSoftcoreParameters constructor
@param numberOfAtoms number of atoms
@param obcType OBC type (Eq. 7 or 8 in paper)
--------------------------------------------------------------------------------------- */
ObcSoftcoreParameters
::
ObcSoftcoreParameters
(
int
numberOfAtoms
,
ObcSoftcoreParameters
::
ObcType
obcType
)
:
_numberOfAtoms
(
numberOfAtoms
),
_obcType
(
obcType
),
_dielectricOffset
(
0.009
),
_nonPolarPreFactor
(
2.25936
),
_soluteDielectric
(
1.0
),
_solventDielectric
(
78.3
),
_probeRadius
(
0.14
),
_electricConstant
(
-
0.5
*
ONE_4PI_EPS0
),
_pi4Asolv
(
28.3919551
),
_cutoff
(
false
),
_periodic
(
false
)
{
_atomicRadii
.
resize
(
numberOfAtoms
);
_scaledRadiusFactors
.
resize
(
numberOfAtoms
);
_nonPolarScaleFactors
.
resize
(
numberOfAtoms
);
setObcTypeParameters
(
obcType
);
}
/**---------------------------------------------------------------------------------------
ObcSoftcoreParameters destructor
--------------------------------------------------------------------------------------- */
ObcSoftcoreParameters
::~
ObcSoftcoreParameters
(
){
}
/**---------------------------------------------------------------------------------------
Get number of atoms
@return number of atoms
--------------------------------------------------------------------------------------- */
int
ObcSoftcoreParameters
::
getNumberOfAtoms
(
void
)
const
{
return
_numberOfAtoms
;
}
/**---------------------------------------------------------------------------------------
Get OBC type
@return OBC type
--------------------------------------------------------------------------------------- */
ObcSoftcoreParameters
::
ObcType
ObcSoftcoreParameters
::
getObcType
(
void
)
const
{
return
_obcType
;
}
/**---------------------------------------------------------------------------------------
Set OBC type specific parameters
@param obcType OBC type (ObcTypeI or ObcTypeII -- Eq. 7 or 8)
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setObcTypeParameters
(
ObcSoftcoreParameters
::
ObcType
obcType
){
if
(
obcType
==
ObcTypeI
){
_alphaObc
=
0.8
f
;
_betaObc
=
0.0
f
;
_gammaObc
=
2.91
f
;
}
else
{
_alphaObc
=
1.0
f
;
_betaObc
=
0.8
f
;
_gammaObc
=
4.85
f
;
}
_obcType
=
obcType
;
}
/**---------------------------------------------------------------------------------------
Get dielectricOffset
@return _dielectricOffset
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getDielectricOffset
(
void
)
const
{
return
_dielectricOffset
;
}
/**---------------------------------------------------------------------------------------
Get alpha OBC (Eqs. 6 & 7) in Proteins paper
@return alphaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getAlphaObc
(
void
)
const
{
return
_alphaObc
;
}
/**---------------------------------------------------------------------------------------
Get beta OBC (Eqs. 6 & 7) in Proteins paper
@return betaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getBetaObc
(
void
)
const
{
return
_betaObc
;
}
/**---------------------------------------------------------------------------------------
Get gamma OBC (Eqs. 6 & 7) in Proteins paper
@return gammaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getGammaObc
(
void
)
const
{
return
_gammaObc
;
}
/**---------------------------------------------------------------------------------------
Get solvent dielectric
@return solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getSolventDielectric
(
void
)
const
{
return
_solventDielectric
;
}
/**---------------------------------------------------------------------------------------
Set solvent dielectric
@param solventDielectric solvent dielectric
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setSolventDielectric
(
RealOpenMM
solventDielectric
){
_solventDielectric
=
solventDielectric
;
}
/**---------------------------------------------------------------------------------------
Get solute dielectric
@return soluteDielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getSoluteDielectric
(
void
)
const
{
return
_soluteDielectric
;
}
/**---------------------------------------------------------------------------------------
Set solute dielectric
@param soluteDielectric solute dielectric
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setSoluteDielectric
(
RealOpenMM
soluteDielectric
){
_soluteDielectric
=
soluteDielectric
;
}
/**---------------------------------------------------------------------------------------
Get electric constant
@return electricConstant
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getElectricConstant
(
void
)
const
{
return
_electricConstant
;
}
/**---------------------------------------------------------------------------------------
Get probe radius
@return probeRadius
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getProbeRadius
(
void
)
const
{
return
_probeRadius
;
}
/**---------------------------------------------------------------------------------------
Set probe radius
@param probeRadius probe radius
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setProbeRadius
(
RealOpenMM
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)
@return pi4Asolv
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getPi4Asolv
(
void
)
const
{
return
_pi4Asolv
;
}
/**---------------------------------------------------------------------------------------
Get AtomicRadii array
@return array of atomic radii
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
ObcSoftcoreParameters
::
getAtomicRadii
(
void
)
const
{
return
_atomicRadii
;
}
/**---------------------------------------------------------------------------------------
Set AtomicRadii array
@param atomicRadii vector of atomic radii
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setAtomicRadii
(
const
RealOpenMMVector
&
atomicRadii
){
if
(
atomicRadii
.
size
()
==
_atomicRadii
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
atomicRadii
.
size
();
ii
++
){
_atomicRadii
[
ii
]
=
atomicRadii
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"ObcSoftcoreParameters: input size for atomic radii does not agree w/ current size: input="
;
msg
<<
atomicRadii
.
size
();
msg
<<
" current size="
<<
_atomicRadii
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Return OBC scale factors
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
ObcSoftcoreParameters
::
getScaledRadiusFactors
(
void
)
const
{
return
_scaledRadiusFactors
;
}
/**---------------------------------------------------------------------------------------
Set OBC scale factors
@param scaledRadiusFactors scaledRadiusFactors
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setScaledRadiusFactors
(
const
RealOpenMMVector
&
scaledRadiusFactors
){
if
(
scaledRadiusFactors
.
size
()
==
_scaledRadiusFactors
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
scaledRadiusFactors
.
size
();
ii
++
){
_scaledRadiusFactors
[
ii
]
=
scaledRadiusFactors
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"ObcSoftcoreParameters: input size for scaled radius factors does not agree w/ current size: input="
;
msg
<<
scaledRadiusFactors
.
size
();
msg
<<
" current size="
<<
_scaledRadiusFactors
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Set the force to use a cutoff.
@param distance the cutoff distance
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setUseCutoff
(
RealOpenMM
distance
)
{
_cutoff
=
true
;
_cutoffDistance
=
distance
;
}
/**---------------------------------------------------------------------------------------
Get whether to use a cutoff.
--------------------------------------------------------------------------------------- */
bool
ObcSoftcoreParameters
::
getUseCutoff
()
{
return
_cutoff
;
}
/**---------------------------------------------------------------------------------------
Get the cutoff distance.
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcSoftcoreParameters
::
getCutoffDistance
()
{
return
_cutoffDistance
;
}
/**---------------------------------------------------------------------------------------
Set the force to use periodic boundary conditions. This requires that a cutoff has
also been set, and the smallest side of the periodic box is at least twice the cutoff
distance.
@param boxSize the X, Y, and Z widths of the periodic box
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setPeriodic
(
RealOpenMM
*
boxSize
)
{
assert
(
_cutoff
);
assert
(
boxSize
[
0
]
>=
2.0
*
_cutoffDistance
);
assert
(
boxSize
[
1
]
>=
2.0
*
_cutoffDistance
);
assert
(
boxSize
[
2
]
>=
2.0
*
_cutoffDistance
);
_periodic
=
true
;
_periodicBoxSize
[
0
]
=
boxSize
[
0
];
_periodicBoxSize
[
1
]
=
boxSize
[
1
];
_periodicBoxSize
[
2
]
=
boxSize
[
2
];
}
/**---------------------------------------------------------------------------------------
Get whether to use periodic boundary conditions.
--------------------------------------------------------------------------------------- */
bool
ObcSoftcoreParameters
::
getPeriodic
()
{
return
_periodic
;
}
/**---------------------------------------------------------------------------------------
Get the periodic box dimension
--------------------------------------------------------------------------------------- */
const
RealOpenMM
*
ObcSoftcoreParameters
::
getPeriodicBox
()
{
return
_periodicBoxSize
;
}
/**---------------------------------------------------------------------------------------
Return non-polar scale factors
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
ObcSoftcoreParameters
::
getNonPolarScaleFactors
(
void
)
const
{
return
_nonPolarScaleFactors
;
}
/**---------------------------------------------------------------------------------------
Set non-polar scale factors
@param nonPolarScaleFactors nonPolarScaleFactors
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setNonPolarScaleFactors
(
const
RealOpenMMVector
&
nonPolarScaleFactors
){
if
(
nonPolarScaleFactors
.
size
()
==
_nonPolarScaleFactors
.
size
()
){
for
(
unsigned
int
ii
=
0
;
ii
<
nonPolarScaleFactors
.
size
();
ii
++
){
_nonPolarScaleFactors
[
ii
]
=
nonPolarScaleFactors
[
ii
];
}
}
else
{
std
::
stringstream
msg
;
msg
<<
"ObcSoftcoreParameters: input size for non-polar scale factors does not agree w/ current size: input="
;
msg
<<
nonPolarScaleFactors
.
size
();
msg
<<
" current size="
<<
_nonPolarScaleFactors
.
size
();
throw
OpenMM
::
OpenMMException
(
msg
.
str
());
}
}
/**---------------------------------------------------------------------------------------
Set OBC scale factors
@param nonPolarScaleFactors nonPolarScaleFactors
--------------------------------------------------------------------------------------- */
void
ObcSoftcoreParameters
::
setNonPolarPrefactor
(
RealOpenMM
nonPolarPreFactor
){
_nonPolarPreFactor
=
nonPolarPreFactor
;
}
plugins/freeEnergy/platforms/reference/src/gbsa/ObcSoftcoreParameters.h
deleted
100755 → 0
View file @
c775bd19
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
* Contributors: Pande Group
*
* 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.
*/
#ifndef __ObcSoftcoreParameters_H__
#define __ObcSoftcoreParameters_H__
#include "../SimTKUtilities/SimTKOpenMMCommon.h"
// ---------------------------------------------------------------------------------------
class
ObcSoftcoreParameters
{
public:
// OBC types
enum
ObcType
{
ObcTypeI
,
ObcTypeII
};
private:
int
_numberOfAtoms
;
// OBC constants & parameters
RealOpenMM
_dielectricOffset
;
RealOpenMM
_alphaObc
;
RealOpenMM
_betaObc
;
RealOpenMM
_gammaObc
;
RealOpenMM
_probeRadius
;
RealOpenMM
_pi4Asolv
;
ObcType
_obcType
;
RealOpenMM
_nonPolarPreFactor
;
RealOpenMM
_solventDielectric
;
RealOpenMM
_soluteDielectric
;
RealOpenMM
_electricConstant
;
// scaling factors for nonpolar term
RealOpenMMVector
_atomicRadii
;
RealOpenMMVector
_nonPolarScaleFactors
;
// scaled radius factors (S_kk in HCT paper)
RealOpenMMVector
_scaledRadiusFactors
;
// cutoff and periodic boundary conditions
bool
_cutoff
;
bool
_periodic
;
RealOpenMM
_periodicBoxSize
[
3
];
RealOpenMM
_cutoffDistance
;
public:
/**---------------------------------------------------------------------------------------
ObcSoftcoreParameters constructor
@param numberOfAtoms number of atoms
--------------------------------------------------------------------------------------- */
ObcSoftcoreParameters
(
int
numberOfAtoms
,
ObcSoftcoreParameters
::
ObcType
obcType
=
ObcTypeII
);
/**---------------------------------------------------------------------------------------
ObcSoftcoreParameters destructor
--------------------------------------------------------------------------------------- */
~
ObcSoftcoreParameters
(
);
/**---------------------------------------------------------------------------------------
Get number of atoms
@return number of atoms
--------------------------------------------------------------------------------------- */
int
getNumberOfAtoms
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get electric constant
@return electric constant
--------------------------------------------------------------------------------------- */
RealOpenMM
getElectricConstant
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get probe radius
@return probeRadius
--------------------------------------------------------------------------------------- */
RealOpenMM
getProbeRadius
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set probe radius
@param probeRadius probe radius
--------------------------------------------------------------------------------------- */
void
setProbeRadius
(
RealOpenMM
probeRadius
);
/**---------------------------------------------------------------------------------------
Get pi4Asolv: used in ACE approximation for nonpolar term
((RealOpenMM) M_PI)*4.0f*0.0049f*1000.0f;
@return pi4Asolv
--------------------------------------------------------------------------------------- */
RealOpenMM
getPi4Asolv
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get solvent dielectric
@return solvent dielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
getSolventDielectric
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set solvent dielectric
@param solventDielectric solvent dielectric
--------------------------------------------------------------------------------------- */
void
setSolventDielectric
(
RealOpenMM
solventDielectric
);
/**---------------------------------------------------------------------------------------
Get solute dielectric
@return soluteDielectric
--------------------------------------------------------------------------------------- */
RealOpenMM
getSoluteDielectric
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set solute dielectric
@param soluteDielectric solute dielectric
--------------------------------------------------------------------------------------- */
void
setSoluteDielectric
(
RealOpenMM
soluteDielectric
);
/**---------------------------------------------------------------------------------------
Get OBC type
@return OBC type
--------------------------------------------------------------------------------------- */
ObcSoftcoreParameters
::
ObcType
getObcType
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set OBC type specific parameters
@param obcType OBC type (ObcTypeI or ObcTypeII -- Eq. 7 or 8)
--------------------------------------------------------------------------------------- */
void
setObcTypeParameters
(
ObcSoftcoreParameters
::
ObcType
obcType
);
/**---------------------------------------------------------------------------------------
Get alpha OBC (Eqs. 6 & 7) in Proteins paper
@return alphaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
getAlphaObc
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get beta OBC (Eqs. 6 & 7) in Proteins paper
@return betaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
getBetaObc
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get gamma OBC (Eqs. 6 & 7) in Proteins paper
@return gammaObc
--------------------------------------------------------------------------------------- */
RealOpenMM
getGammaObc
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Get solvent dielectric
@return dielectricOffset dielectric offset
--------------------------------------------------------------------------------------- */
RealOpenMM
getDielectricOffset
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Return OBC scale factors
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getScaledRadiusFactors
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set OBC scale factors
@param input vector of radius factors
--------------------------------------------------------------------------------------- */
void
setScaledRadiusFactors
(
const
RealOpenMMVector
&
scaledRadiusFactors
);
/**---------------------------------------------------------------------------------------
Get AtomicRadii array w/ dielectric offset applied
@return array of atom volumes
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getAtomicRadii
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set AtomicRadii array
@param atomicRadii vector of atomic radii
--------------------------------------------------------------------------------------- */
void
setAtomicRadii
(
const
RealOpenMMVector
&
atomicRadii
);
/**---------------------------------------------------------------------------------------
Set the force to use a cutoff.
@param distance the cutoff distance
--------------------------------------------------------------------------------------- */
void
setUseCutoff
(
RealOpenMM
distance
);
/**---------------------------------------------------------------------------------------
Get whether to use a cutoff.
--------------------------------------------------------------------------------------- */
bool
getUseCutoff
(
void
);
/**---------------------------------------------------------------------------------------
Get the cutoff distance.
--------------------------------------------------------------------------------------- */
RealOpenMM
getCutoffDistance
(
void
);
/**---------------------------------------------------------------------------------------
Set the force to use periodic boundary conditions. This requires that a cutoff has
already been set, and the smallest side of the periodic box is at least twice the cutoff
distance.
@param boxSize the X, Y, and Z widths of the periodic box
--------------------------------------------------------------------------------------- */
void
setPeriodic
(
RealOpenMM
*
boxSize
);
/**---------------------------------------------------------------------------------------
Get whether to use periodic boundary conditions.
--------------------------------------------------------------------------------------- */
bool
getPeriodic
(
void
);
/**---------------------------------------------------------------------------------------
Get the periodic box dimension
--------------------------------------------------------------------------------------- */
const
RealOpenMM
*
getPeriodicBox
(
void
);
/**---------------------------------------------------------------------------------------
Return non-polar scale factors
@return array
--------------------------------------------------------------------------------------- */
const
RealOpenMMVector
&
getNonPolarScaleFactors
(
void
)
const
;
/**---------------------------------------------------------------------------------------
Set non-polar scale factors
@param nonPolarScaleFactors nonpolar scale factors
--------------------------------------------------------------------------------------- */
void
setNonPolarScaleFactors
(
const
RealOpenMMVector
&
nonPolarScaleFactors
);
/**---------------------------------------------------------------------------------------
Set nonPolarPrefactor
@param nonPolarPrefactor solute dielectric
--------------------------------------------------------------------------------------- */
void
setNonPolarPrefactor
(
RealOpenMM
nonPolarPrefactor
);
};
// ---------------------------------------------------------------------------------------
#endif // __ObcSoftcoreParameters_H__
plugins/freeEnergy/platforms/reference/tests/CMakeLists.txt
deleted
100644 → 0
View file @
c775bd19
#
# Testing
#
ENABLE_TESTING
()
Set
(
SHARED_OPENMM_TARGET OpenMMFreeEnergy
)
IF
(
UNIX AND CMAKE_BUILD_TYPE MATCHES Debug
)
SET
(
SHARED_OPENMM_TARGET
${
SHARED_OPENMM_TARGET
}
_d
)
ENDIF
(
UNIX AND CMAKE_BUILD_TYPE MATCHES Debug
)
# Automatically create tests using files named "Test*.cpp"
FILE
(
GLOB TEST_PROGS
"*Test*.cpp"
)
FOREACH
(
TEST_PROG
${
TEST_PROGS
}
)
GET_FILENAME_COMPONENT
(
TEST_ROOT
${
TEST_PROG
}
NAME_WE
)
# Link with shared library
ADD_EXECUTABLE
(
${
TEST_ROOT
}
${
TEST_PROG
}
)
TARGET_LINK_LIBRARIES
(
${
TEST_ROOT
}
${
SHARED_TARGET
}
${
SHARED_OPENMM_TARGET
}
)
ADD_TEST
(
${
TEST_ROOT
}
${
EXECUTABLE_OUTPUT_PATH
}
/
${
TEST_ROOT
}
)
# Link with static library
# SET(TEST_STATIC ${TEST_ROOT}Static)
# CUDA_ADD_EXECUTABLE(${TEST_STATIC} ${TEST_PROG})
# SET_TARGET_PROPERTIES(${TEST_STATIC}
# PROPERTIES
# COMPILE_FLAGS "-DOPENMM_USE_STATIC_LIBRARIES"
# )
# TARGET_LINK_LIBRARIES(${TEST_STATIC} ${STATIC_TARGET})
# ADD_TEST(${TEST_STATIC} ${EXECUTABLE_OUTPUT_PATH}/${TEST_STATIC})
ENDFOREACH
(
TEST_PROG
${
TEST_PROGS
}
)
# TestCudaUsingParameterFile customized w/ command-line argument (input file name used in test)
#ADD_EXECUTABLE(TestCudaUsingParameterFile TstCudaUsingParameterFile.cpp)
#TARGET_LINK_LIBRARIES(TestCudaUsingParameterFile ${SHARED_TARGET})
#ADD_TEST(TestCudaUsingParameterFile "${EXECUTABLE_OUTPUT_PATH}/TestCudaUsingParameterFile" "-parameterFileName" "${CMAKE_CURRENT_SOURCE_DIR}/lambdaSdObcParameters.txt")
#ADD_TEST(TestCudaUsingParameterFile "${EXECUTABLE_OUTPUT_PATH}/TestCudaUsingParameterFile" "-parameterFileName" "${CMAKE_CURRENT_SOURCE_DIR}/bptiMdRfNoPbcParameters.txt")
#
#SET(TEST_ROOT TestCudaUsingParameterFile)
#SET(TEST_PROG TstCudaUsingParameterFile.cpp)
#SET(TEST_STATIC ${TEST_ROOT}Static)
#SET(INCLUDE_CUDA_STATIC 1)
#IF(INCLUDE_CUDA_STATIC)
# ADD_EXECUTABLE(${TEST_STATIC} ${TEST_PROG})
# SET_TARGET_PROPERTIES(${TEST_STATIC}
# PROPERTIES
# COMPILE_FLAGS "-DOPENMM_USE_STATIC_LIBRARIES"
# )
# TARGET_LINK_LIBRARIES(${TEST_STATIC} ${STATIC_TARGET} ${STATIC_BROOK_TARGET})
# ADD_TEST(${TEST_STATIC} "${EXECUTABLE_OUTPUT_PATH}/TestCudaUsingParameterFileStatic" "-parameterFileName" "${CMAKE_CURRENT_SOURCE_DIR}/lambdaSdObcParameters.txt")
# ADD_TEST(${TEST_STATIC} "${EXECUTABLE_OUTPUT_PATH}/TestCudaUsingParameterFileStatic" "-parameterFileName" "${CMAKE_CURRENT_SOURCE_DIR}/bptiMdRfNoPbcParameters.txt")
# ADD_TEST(${TEST_STATIC} "${EXECUTABLE_OUTPUT_PATH}/TestCudaUsingParameterFileStatic" "-parameterFileName" "${CMAKE_CURRENT_SOURCE_DIR}/bptiMdRfPbcParameters.txt" " +checkEnergyForceConsistent -checkForces" )
#ENDIF(INCLUDE_CUDA_STATIC)
plugins/freeEnergy/platforms/reference/tests/TestReferenceGBVISoftcoreForce.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2008-2009 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. *
* -------------------------------------------------------------------------- */
/**
* This tests the reference implementation of GBVIForce.
*/
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/Context.h"
#include "ReferencePlatform.h"
#include "openmm/GBVISoftcoreForce.h"
#include "openmm/GBSAOBCForce.h"
#include "openmm/CustomGBForce.h"
#include "openmm/System.h"
#include "openmm/LangevinIntegrator.h"
#include "openmm/NonbondedForce.h"
#include "openmm/NonbondedSoftcoreForce.h"
#include "../src/SimTKUtilities/SimTKOpenMMRealType.h"
#include "../../../../../libraries/sfmt/include/sfmt/SFMT.h"
#include "OpenMMFreeEnergy.h"
#include "openmm/freeEnergyKernels.h"
#include "ReferenceFreeEnergyKernelFactory.h"
#define USE_SOFTCORE
#include "TestReferenceSoftcoreForce.h"
#define OBC_FLAG 1
#define GBVI_FLAG 2
#define IMPLICIT_SOLVENT GBVI_FLAG
#include <iomanip>
using
namespace
OpenMM
;
using
namespace
std
;
#define PRINT_ON 0
int
compareForcesOfTwoStates
(
int
numParticles
,
State
&
state1
,
State
&
state2
,
double
relativeTolerance
,
double
absoluteTolerance
)
{
int
error
=
0
;
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
Vec3
f1
=
state1
.
getForces
()[
i
];
Vec3
f2
=
state2
.
getForces
()[
i
];
double
diff
=
(
f1
[
0
]
-
f2
[
0
])
*
(
f1
[
0
]
-
f2
[
0
])
+
(
f1
[
1
]
-
f2
[
1
])
*
(
f1
[
1
]
-
f2
[
1
])
+
(
f1
[
2
]
-
f2
[
2
])
*
(
f1
[
2
]
-
f2
[
2
]);
double
denom1
=
fabs
(
f1
[
0
]
)
+
fabs
(
f1
[
1
]
)
+
fabs
(
f1
[
2
]
);
double
denom2
=
fabs
(
f2
[
0
]
)
+
fabs
(
f2
[
1
]
)
+
fabs
(
f2
[
2
]
);
int
ok
=
1
;
if
(
(
denom1
>
0.0
||
denom2
>
0.0
)
&&
(
sqrt
(
diff
)
/
(
denom1
+
denom2
))
>
relativeTolerance
){
error
++
;
ok
=
0
;
}
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"F %d [%14.6e %14.6e %14.6e] [%14.6e %14.6e %14.6e] %s
\n
"
,
i
,
f1
[
0
],
f1
[
1
],
f1
[
2
],
f2
[
0
],
f2
[
1
],
f2
[
2
],
(
ok
?
""
:
"XXXXXX"
)
);
#endif
}
return
error
;
}
void
testSingleParticle
()
{
#if 0
CudaPlatform platform;
CudaFreeEnergyKernelFactory* factory = new CudaFreeEnergyKernelFactory();
platform.registerKernelFactory(CalcNonbondedSoftcoreForceKernel::Name(), factory);
platform.registerKernelFactory(CalcGBVISoftcoreForceKernel::Name(), factory);
platform.registerKernelFactory(CalcGBSAOBCSoftcoreForceKernel::Name(), factory);
#else
ReferencePlatform
platform
;
ReferenceFreeEnergyKernelFactory
*
referenceFactoryT
=
new
ReferenceFreeEnergyKernelFactory
();
platform
.
registerKernelFactory
(
CalcNonbondedSoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
platform
.
registerKernelFactory
(
CalcGBVISoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
platform
.
registerKernelFactory
(
CalcGBSAOBCSoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
#endif
System
system
;
system
.
addParticle
(
2.0
);
LangevinIntegrator
integrator
(
0
,
0.1
,
0.01
);
GBVISoftcoreForce
*
forceField
=
new
GBVISoftcoreForce
();
double
charge
=
1.0
;
double
radius
=
0.15
;
double
gamma
=
1.0
;
forceField
->
addParticle
(
charge
,
radius
,
gamma
);
system
.
addForce
(
forceField
);
NonbondedSoftcoreForce
*
nonbonded
=
new
NonbondedSoftcoreForce
();
nonbonded
->
setNonbondedMethod
(
NonbondedSoftcoreForce
::
NoCutoff
);
nonbonded
->
addParticle
(
charge
,
1.0
,
0.0
);
system
.
addForce
(
nonbonded
);
Context
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
1
);
positions
[
0
]
=
Vec3
(
0
,
0
,
0
);
context
.
setPositions
(
positions
);
State
state
=
context
.
getState
(
State
::
Energy
);
double
bornRadius
=
radius
;
double
eps0
=
EPSILON0
;
double
tau
=
(
1.0
/
forceField
->
getSoluteDielectric
()
-
1.0
/
forceField
->
getSolventDielectric
());
double
bornEnergy
=
(
-
charge
*
charge
/
(
8
*
PI_M
*
eps0
))
*
tau
/
bornRadius
;
double
nonpolarEnergy
=
-
gamma
*
tau
*
std
::
pow
(
radius
/
bornRadius
,
3.0
);
double
expectedE
=
(
bornEnergy
+
nonpolarEnergy
);
double
obtainedE
=
state
.
getPotentialEnergy
();
double
diff
=
fabs
(
obtainedE
-
expectedE
);
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"testSingleParticle expected=%14.6e obtained=%14.6e diff=%14.6e breakdown:[%14.6e %14.6e]
\n
"
,
expectedE
,
obtainedE
,
diff
,
bornEnergy
,
nonpolarEnergy
);
#endif
ASSERT_EQUAL_TOL
((
bornEnergy
+
nonpolarEnergy
),
state
.
getPotentialEnergy
(),
0.01
);
}
void
testEnergyEthaneSwitchingFunction
(
int
useSwitchingFunction
)
{
std
::
string
methodName
=
"testEnergyEthaneSwitchingFunction"
;
#if 0
CudaPlatform platform;
CudaFreeEnergyKernelFactory* factory = new CudaFreeEnergyKernelFactory();
platform.registerKernelFactory(CalcNonbondedSoftcoreForceKernel::Name(), factory);
platform.registerKernelFactory(CalcGBVISoftcoreForceKernel::Name(), factory);
platform.registerKernelFactory(CalcGBSAOBCSoftcoreForceKernel::Name(), factory);
#else
ReferencePlatform
platform
;
ReferenceFreeEnergyKernelFactory
*
referenceFactoryT
=
new
ReferenceFreeEnergyKernelFactory
();
platform
.
registerKernelFactory
(
CalcNonbondedSoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
platform
.
registerKernelFactory
(
CalcGBVISoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
platform
.
registerKernelFactory
(
CalcGBSAOBCSoftcoreForceKernel
::
Name
(),
referenceFactoryT
);
#endif
ReferencePlatform
referencePlatform
;
ReferenceFreeEnergyKernelFactory
*
referenceFactory
=
new
ReferenceFreeEnergyKernelFactory
();
referencePlatform
.
registerKernelFactory
(
CalcNonbondedSoftcoreForceKernel
::
Name
(),
referenceFactory
);
referencePlatform
.
registerKernelFactory
(
CalcGBVISoftcoreForceKernel
::
Name
(),
referenceFactory
);
referencePlatform
.
registerKernelFactory
(
CalcGBSAOBCSoftcoreForceKernel
::
Name
(),
referenceFactory
);
System
system
;
const
int
numParticles
=
8
;
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
){
system
.
addParticle
(
1.0
);
}
LangevinIntegrator
integrator1
(
0
,
0.1
,
0.01
);
LangevinIntegrator
integrator2
(
0
,
0.1
,
0.01
);
double
C_HBondDistance
=
0.1097
;
double
C_CBondDistance
=
0.1504
;
NonbondedSoftcoreForce
*
nonbonded
=
new
NonbondedSoftcoreForce
();
nonbonded
->
setNonbondedMethod
(
NonbondedSoftcoreForce
::
NoCutoff
);
double
C_radius
,
C_gamma
,
C_charge
,
H_radius
,
H_gamma
,
H_charge
;
int
AM1_BCC
=
1
;
H_charge
=
-
0.053
;
C_charge
=
-
3.0
*
H_charge
;
if
(
AM1_BCC
){
C_radius
=
0.180
;
//C_radius = 0.360;
C_gamma
=
-
0.2863
;
C_gamma
=
1.0
;
H_radius
=
0.125
;
//H_radius = 0.25;
H_gamma
=
0.2437
;
H_gamma
=
1.0
;
//H_charge = C_charge = 0.0;
//H_gamma = C_gamma = 0.0;
}
else
{
C_radius
=
0.215
;
C_gamma
=
-
1.1087
;
H_radius
=
0.150
;
H_gamma
=
0.1237
;
}
// for ethane all Coulomb forces are excluded since all atoms 3 or
// fewer bonds away from all other atoms -- is this true for H's on
// difference carbons? -- should be computed in 14 ixn
double
bornRadiusScaleFactorsEven
=
0.5
;
//double bornRadiusScaleFactorsEven = 1.0;
//double bornRadiusScaleFactorsOdd = 0.5;
double
bornRadiusScaleFactorsOdd
=
1.0
;
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"%s: Applying GB/VI
\n
"
,
methodName
.
c_str
()
);
(
void
)
fprintf
(
stderr
,
"C[%14.7e %14.7e %14.7e] H[%14.7e %14.7e %14.7e] scale[%.1f %.1f]
\n
"
,
C_charge
,
C_radius
,
C_gamma
,
H_charge
,
H_radius
,
H_gamma
,
bornRadiusScaleFactorsEven
,
bornRadiusScaleFactorsOdd
);
#endif
GBVISoftcoreForce
*
forceField
=
new
GBVISoftcoreForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
){
forceField
->
addParticle
(
H_charge
,
H_radius
,
H_gamma
,
(
i
%
2
)
?
bornRadiusScaleFactorsOdd
:
bornRadiusScaleFactorsEven
);
nonbonded
->
addParticle
(
H_charge
,
H_radius
,
0.0
);
}
forceField
->
setParticleParameters
(
1
,
C_charge
,
C_radius
,
C_gamma
,
bornRadiusScaleFactorsOdd
);
nonbonded
->
setParticleParameters
(
1
,
C_charge
,
C_radius
,
0.0
);
forceField
->
setParticleParameters
(
4
,
C_charge
,
C_radius
,
C_gamma
,
bornRadiusScaleFactorsEven
);
nonbonded
->
setParticleParameters
(
4
,
C_charge
,
C_radius
,
0.0
);
// forceField->setParticleParameters( 8, C_charge, (C_radius+0.5), C_gamma, bornRadiusScaleFactorsEven);
// nonbonded->setParticleParameters( 8, C_charge, C_radius, 0.0);
if
(
useSwitchingFunction
){
forceField
->
setBornRadiusScalingMethod
(
GBVISoftcoreForce
::
QuinticSpline
);
}
else
{
forceField
->
setBornRadiusScalingMethod
(
GBVISoftcoreForce
::
NoScaling
);
}
forceField
->
addBond
(
0
,
1
,
C_HBondDistance
);
forceField
->
addBond
(
2
,
1
,
C_HBondDistance
);
forceField
->
addBond
(
3
,
1
,
C_HBondDistance
);
forceField
->
addBond
(
1
,
4
,
C_CBondDistance
);
forceField
->
addBond
(
5
,
4
,
C_HBondDistance
);
forceField
->
addBond
(
6
,
4
,
C_HBondDistance
);
forceField
->
addBond
(
7
,
4
,
C_HBondDistance
);
std
::
vector
<
pair
<
int
,
int
>
>
bonds
;
std
::
vector
<
double
>
bondDistances
;
bonds
.
push_back
(
pair
<
int
,
int
>
(
0
,
1
));
bondDistances
.
push_back
(
C_HBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
2
,
1
));
bondDistances
.
push_back
(
C_HBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
3
,
1
));
bondDistances
.
push_back
(
C_HBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
1
,
4
));
bondDistances
.
push_back
(
C_CBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
5
,
4
));
bondDistances
.
push_back
(
C_HBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
6
,
4
));
bondDistances
.
push_back
(
C_HBondDistance
);
bonds
.
push_back
(
pair
<
int
,
int
>
(
7
,
4
));
bondDistances
.
push_back
(
C_HBondDistance
);
nonbonded
->
createExceptionsFromBonds
(
bonds
,
0.0
,
0.0
);
system
.
addForce
(
forceField
);
system
.
addForce
(
nonbonded
);
Context
referenceContext
(
system
,
integrator1
,
referencePlatform
);
Context
context
(
system
,
integrator2
,
platform
);
vector
<
Vec3
>
positions
(
numParticles
);
positions
[
0
]
=
Vec3
(
0.5480
,
1.7661
,
0.0000
);
positions
[
1
]
=
Vec3
(
0.7286
,
0.8978
,
0.6468
);
positions
[
2
]
=
Vec3
(
0.4974
,
0.0000
,
0.0588
);
positions
[
3
]
=
Vec3
(
0.0000
,
0.9459
,
1.4666
);
positions
[
4
]
=
Vec3
(
2.1421
,
0.8746
,
1.1615
);
positions
[
5
]
=
Vec3
(
2.3239
,
0.0050
,
1.8065
);
positions
[
6
]
=
Vec3
(
2.8705
,
0.8295
,
0.3416
);
positions
[
7
]
=
Vec3
(
2.3722
,
1.7711
,
1.7518
);
//positions[8] = Vec3(2.1421, 0.8746, 2.1615);
vector
<
Vec3
>
originalPositions
(
numParticles
);
for
(
int
ii
=
0
;
ii
<
numParticles
;
ii
++
){
originalPositions
[
ii
][
0
]
=
positions
[
ii
][
0
];
originalPositions
[
ii
][
1
]
=
positions
[
ii
][
1
];
originalPositions
[
ii
][
2
]
=
positions
[
ii
][
2
];
}
int
tries
=
1
;
double
positionIncrement
=
0.15
;
for
(
int
ii
=
0
;
ii
<
tries
;
ii
++
){
context
.
setPositions
(
positions
);
referenceContext
.
setPositions
(
positions
);
State
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
State
referenceState
=
referenceContext
.
getState
(
State
::
Forces
|
State
::
Energy
);
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"cudaE=%14.7e refE=%14.7e
\n
"
,
state
.
getPotentialEnergy
(),
referenceState
.
getPotentialEnergy
()
);
#endif
// Take a small step in the direction of the energy gradient.
if
(
compareForcesOfTwoStates
(
numParticles
,
state
,
referenceState
,
0.001
,
0.001
)
){
ASSERT_EQUAL_TOL
(
0.0
,
1.0
,
0.01
)
}
double
norm
=
0.0
;
double
forceSum
[
3
]
=
{
0.0
,
0.0
,
0.0
};
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
Vec3
f
=
state
.
getForces
()[
i
];
norm
+=
f
[
0
]
*
f
[
0
]
+
f
[
1
]
*
f
[
1
]
+
f
[
2
]
*
f
[
2
];
forceSum
[
0
]
+=
f
[
0
];
forceSum
[
1
]
+=
f
[
1
];
forceSum
[
2
]
+=
f
[
2
];
}
norm
=
std
::
sqrt
(
norm
);
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"Fsum [%14.7e %14.7e %14.7e] norm=%14.7e
\n
"
,
forceSum
[
0
],
forceSum
[
1
],
forceSum
[
2
],
norm
);
#endif
const
double
delta
=
1e-03
;
double
step
=
delta
/
norm
;
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
Vec3
p
=
positions
[
i
];
Vec3
f
=
state
.
getForces
()[
i
];
positions
[
i
]
=
Vec3
(
p
[
0
]
-
f
[
0
]
*
step
,
p
[
1
]
-
f
[
1
]
*
step
,
p
[
2
]
-
f
[
2
]
*
step
);
}
context
.
setPositions
(
positions
);
State
state2
=
context
.
getState
(
State
::
Energy
);
double
diff
=
(
state2
.
getPotentialEnergy
()
-
state
.
getPotentialEnergy
())
/
delta
;
double
off
=
fabs
(
diff
-
norm
)
/
norm
;
#if PRINT_ON == 1
(
void
)
fprintf
(
stderr
,
"%2d Energies %.8e %.8e norms[%13.7e %13.7e] deltaNorms=%13.7e delta=%.2e
\n
"
,
ii
,
state
.
getPotentialEnergy
(),
state2
.
getPotentialEnergy
(),
diff
,
norm
,
off
,
delta
);
#endif
// See whether the potential energy changed by the expected amount.
ASSERT_EQUAL_TOL
(
norm
,
(
state2
.
getPotentialEnergy
()
-
state
.
getPotentialEnergy
())
/
delta
,
1e-3
*
abs
(
state
.
getPotentialEnergy
())
);
if
(
ii
<
(
tries
-
1
)
){
for
(
int
jj
=
0
;
jj
<
numParticles
;
jj
++
){
positions
[
jj
][
0
]
=
originalPositions
[
jj
][
0
];
positions
[
jj
][
1
]
=
originalPositions
[
jj
][
1
];
positions
[
jj
][
2
]
=
originalPositions
[
jj
][
2
];
}
// positions[8][2] -= static_cast<double>(ii+1)*0.1;
// positions[8][2] -= 0.001;
(
void
)
fprintf
(
stderr
,
"r48=%14.6e r28=%14.6e r24=%14.6e
\n
"
,
positions
[
8
][
2
]
-
positions
[
4
][
2
],
positions
[
8
][
2
],
positions
[
4
][
2
]
);
}
#if 0
int carbonIndex = 1;
int hydrogenIndex = 0;
while( hydrogenIndex < 8 ){
Vec3 carbonDelta;
for( int kk = 0; kk < 3; kk++ ){
positions[hydrogenIndex][kk] += positionIncrement*(positions[carbonIndex][kk] - positions[hydrogenIndex][kk] );
}
double dist = 0.0;
for( int kk = 0; kk < 3; kk++ ){
dist += (positions[carbonIndex][kk] - positions[hydrogenIndex][kk] )*(positions[carbonIndex][kk] - positions[hydrogenIndex][kk]);
}
(void) fprintf( stderr, "H=%d C=%d r=%14.6e\n", hydrogenIndex, carbonIndex, dist );
hydrogenIndex++;
if( hydrogenIndex == carbonIndex ){
hydrogenIndex++;
}
if( carbonIndex == 1 && hydrogenIndex == 4 ){
carbonIndex = 4;
hydrogenIndex = 5;
}
}
#endif
}
}
// computes the scaled radii based on covalent info and atomic radii
#ifdef USE_SOFTCORE
static
void
findScaledRadii
(
const
GBVISoftcoreForce
&
gbviForce
,
std
::
vector
<
double
>
&
scaledRadii
,
FILE
*
log
)
{
#else
static
void
findScaledRadii
(
const
GBVIForce
&
gbviForce
,
std
::
vector
<
double
>
&
scaledRadii
,
FILE
*
log
)
{
#endif
int
numberOfParticles
=
gbviForce
.
getNumParticles
();
int
numberOfBonds
=
gbviForce
.
getNumBonds
();
FILE
*
errorLog
=
log
?
log
:
stderr
;
// load 1-2 atom pairs along w/ bond distance using HarmonicBondForce & constraints
// numberOfBonds < 1, indicating they were not set by the user
if
(
numberOfBonds
<
1
&&
numberOfParticles
>
1
){
(
void
)
fprintf
(
errorLog
,
"Warning: no covalent bonds set for GB/VI force!
\n
"
);
}
std
::
vector
<
std
::
vector
<
int
>
>
bondIndices
(
numberOfBonds
);
std
::
vector
<
double
>
bondLengths
(
numberOfBonds
);
std
::
vector
<
double
>
radii
(
numberOfParticles
);
scaledRadii
.
resize
(
numberOfParticles
);
for
(
int
i
=
0
;
i
<
numberOfParticles
;
i
++
)
{
double
charge
,
radius
,
gamma
;
#ifdef USE_SOFTCORE
double
lambda
;
gbviForce
.
getParticleParameters
(
i
,
charge
,
radius
,
gamma
,
lambda
);
#else
gbviForce
.
getParticleParameters
(
i
,
charge
,
radius
,
gamma
);
#endif
radii
[
i
]
=
radius
;
scaledRadii
[
i
]
=
radius
;
}
for
(
int
i
=
0
;
i
<
numberOfBonds
;
i
++
)
{
int
particle1
,
particle2
;
double
bondLength
;
gbviForce
.
getBondParameters
(
i
,
particle1
,
particle2
,
bondLength
);
if
(
particle1
<
0
||
particle1
>=
gbviForce
.
getNumParticles
())
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreForce: Illegal particle index: "
;
msg
<<
particle1
;
throw
OpenMMException
(
msg
.
str
());
}
if
(
particle2
<
0
||
particle2
>=
gbviForce
.
getNumParticles
())
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreForce: Illegal particle index: "
;
msg
<<
particle2
;
throw
OpenMMException
(
msg
.
str
());
}
if
(
bondLength
<
0
)
{
std
::
stringstream
msg
;
msg
<<
"GBVISoftcoreForce: negative bondlength: "
;
msg
<<
bondLength
;
throw
OpenMMException
(
msg
.
str
());
}
bondIndices
[
i
].
push_back
(
particle1
);
bondIndices
[
i
].
push_back
(
particle2
);
bondLengths
[
i
]
=
bondLength
;
}
// load 1-2 indicies for each atom
std
::
vector
<
std
::
vector
<
int
>
>
bonded12
(
numberOfParticles
);
for
(
int
i
=
0
;
i
<
(
int
)
bondIndices
.
size
();
++
i
)
{
bonded12
[
bondIndices
[
i
][
0
]].
push_back
(
i
);
bonded12
[
bondIndices
[
i
][
1
]].
push_back
(
i
);
}
int
errors
=
0
;
// compute scaled radii (Eq. 5 of Labute paper [JCC 29 p. 1693-1698 2008])
for
(
int
j
=
0
;
j
<
(
int
)
bonded12
.
size
();
++
j
){
double
radiusJ
=
radii
[
j
];
double
scaledRadiusJ
;
if
(
bonded12
[
j
].
size
()
==
0
){
if
(
numberOfParticles
>
1
){
(
void
)
fprintf
(
errorLog
,
"Warning GBVIForceImpl::findScaledRadii atom %d has no covalent bonds; using atomic radius=%.3f.
\n
"
,
j
,
radiusJ
);
}
scaledRadiusJ
=
radiusJ
;
// errors++;
}
else
{
double
rJ2
=
radiusJ
*
radiusJ
;
// loop over bonded neighbors of atom j, applying Eq. 5 in Labute
scaledRadiusJ
=
0.0
;
for
(
int
i
=
0
;
i
<
(
int
)
bonded12
[
j
].
size
();
++
i
){
int
index
=
bonded12
[
j
][
i
];
int
bondedAtomIndex
=
(
j
==
bondIndices
[
index
][
0
])
?
bondIndices
[
index
][
1
]
:
bondIndices
[
index
][
0
];
double
radiusI
=
radii
[
bondedAtomIndex
];
double
rI2
=
radiusI
*
radiusI
;
double
a_ij
=
(
radiusI
-
bondLengths
[
index
]);
a_ij
*=
a_ij
;
a_ij
=
(
rJ2
-
a_ij
)
/
(
2.0
*
bondLengths
[
index
]);
double
a_ji
=
radiusJ
-
bondLengths
[
index
];
a_ji
*=
a_ji
;
a_ji
=
(
rI2
-
a_ji
)
/
(
2.0
*
bondLengths
[
index
]);
scaledRadiusJ
+=
a_ij
*
a_ij
*
(
3.0
*
radiusI
-
a_ij
)
+
a_ji
*
a_ji
*
(
3.0
*
radiusJ
-
a_ji
);
}
scaledRadiusJ
=
(
radiusJ
*
radiusJ
*
radiusJ
)
-
0.125
*
scaledRadiusJ
;
if
(
scaledRadiusJ
>
0.0
){
scaledRadiusJ
=
0.95
*
pow
(
scaledRadiusJ
,
(
1.0
/
3.0
)
);
}
else
{
scaledRadiusJ
=
0.0
;
}
}
if
(
log
){
//(void) fprintf( stderr, "scaledRadii %d %12.4f\n", j, scaledRadiusJ );
}
scaledRadii
[
j
]
=
scaledRadiusJ
;
}
// abort if errors
if
(
errors
){
throw
OpenMMException
(
"findScaledRadii errors -- aborting"
);
}
if
(
log
){
(
void
)
fprintf
(
log
,
" R q gamma scaled radii no. bnds
\n
"
);
double
totalQ
=
0.0
;
for
(
int
i
=
0
;
i
<
(
int
)
scaledRadii
.
size
();
i
++
){
double
charge
;
double
gamma
;
double
radiusI
;
gbviForce
.
getParticleParameters
(
i
,
charge
,
radiusI
,
gamma
);
totalQ
+=
charge
;
(
void
)
fprintf
(
log
,
"%4d %14.5e %14.5e %14.5e %14.5e %d
\n
"
,
i
,
radiusI
,
charge
,
gamma
,
scaledRadii
[
i
],
(
int
)
bonded12
[
i
].
size
()
);
}
(
void
)
fprintf
(
log
,
"Total charge=%e
\n
"
,
totalQ
);
(
void
)
fflush
(
log
);
}
return
;
}
// load parameters from gbviForce to customGbviForce
// findScaledRadii() is called to calculate the scaled radii (S)
// S is derived quantity in GBVIForce, not a parameter is the case here
#ifdef USE_SOFTCORE
static
void
loadGbviParameters
(
const
GBVISoftcoreForce
&
gbviSoftcoreForce
,
CustomGBForce
&
customGbviForce
,
FILE
*
log
)
{
vector
<
double
>
params
(
5
);
double
lambda
;
#else
static
void
loadGbviParameters
(
const
GBVIForce
&
gbviSoftcoreForce
,
CustomGBForce
&
customGbviForce
,
FILE
*
log
)
{
vector
<
double
>
params
(
4
);
#endif
int
numParticles
=
gbviSoftcoreForce
.
getNumParticles
();
// get scaled radii
std
::
vector
<
double
>
scaledRadii
(
numParticles
);
findScaledRadii
(
gbviSoftcoreForce
,
scaledRadii
,
log
);
for
(
int
ii
=
0
;
ii
<
numParticles
;
ii
++
)
{
double
charge
,
radius
,
gamma
;
#ifdef USE_SOFTCORE
gbviSoftcoreForce
.
getParticleParameters
(
ii
,
charge
,
radius
,
gamma
,
lambda
);
params
[
4
]
=
lambda
;
#else
gbviSoftcoreForce
.
getParticleParameters
(
ii
,
charge
,
radius
,
gamma
);
#endif
params
[
0
]
=
charge
;
params
[
1
]
=
radius
;
params
[
2
]
=
scaledRadii
[
ii
];
params
[
3
]
=
gamma
;
customGbviForce
.
addParticle
(
params
);
}
}
// create custom GB/VI force
#ifdef USE_SOFTCORE
static
void
createCustomGBVI
(
CustomGBForce
&
customGbviForce
,
const
GBVISoftcoreForce
&
gbviSoftcoreForce
,
FILE
*
log
){
#else
static
void
createCustomGBVI
(
CustomGBForce
&
customGbviForce
,
const
GBVIForce
&
gbviSoftcoreForce
,
FILE
*
log
){
#endif
customGbviForce
.
setCutoffDistance
(
gbviSoftcoreForce
.
getCutoffDistance
()
);
customGbviForce
.
addPerParticleParameter
(
"q"
);
customGbviForce
.
addPerParticleParameter
(
"radius"
);
customGbviForce
.
addPerParticleParameter
(
"scaleFactor"
);
// derived in GBVIForceImpl implmentation, but parameter here
customGbviForce
.
addPerParticleParameter
(
"gamma"
);
customGbviForce
.
addGlobalParameter
(
"solventDielectric"
,
gbviSoftcoreForce
.
getSolventDielectric
()
);
customGbviForce
.
addGlobalParameter
(
"soluteDielectric"
,
gbviSoftcoreForce
.
getSoluteDielectric
()
);
#ifdef USE_SOFTCORE
customGbviForce
.
addPerParticleParameter
(
"lambda"
);
customGbviForce
.
addComputedValue
(
"V"
,
" lambda2*(uL - lL + factor3/(radius1*radius1*radius1));"
"uL = 1.5*x2uI*(0.25*rI-0.33333*xuI+0.125*(r2-S2)*rI*x2uI);"
"lL = 1.5*x2lI*(0.25*rI-0.33333*xlI+0.125*(r2-S2)*rI*x2lI);"
"x2lI = 1.0/(xl*xl);"
"xlI = 1.0/(xl);"
"xuI = 1.0/(xu);"
"x2uI = 1.0/(xu*xu);"
"xu = (r+scaleFactor2);"
"rI = 1.0/(r);"
"r2 = (r*r);"
"xl = factor1*lMax + factor2*xuu + factor3*(r-scaleFactor2);"
"xuu = (r+scaleFactor2);"
"S2 = (scaleFactor2*scaleFactor2);"
"factor1 = step(r-absRadiusScaleDiff);"
"absRadiusScaleDiff = abs(radiusScaleDiff);"
"radiusScaleDiff = (radius1-scaleFactor2);"
"factor2 = step(radius1-scaleFactor2-r);"
"factor3 = step(scaleFactor2-radius1-r);"
"lMax = max(radius1,r-scaleFactor2);"
,
CustomGBForce
::
ParticlePairNoExclusions
);
customGbviForce
.
addComputedValue
(
"B"
,
"(1.0/(radius*radius*radius)-V)^(-0.33333333)"
,
CustomGBForce
::
SingleParticle
);
// nonpolar term + polar self energy
customGbviForce
.
addEnergyTerm
(
"(-138.935485*0.5*((1.0/soluteDielectric)-(1.0/solventDielectric))*q^2/B)-((1.0/soluteDielectric)-(1.0/solventDielectric))*((gamma*(radius/B)^3))"
,
CustomGBForce
::
SingleParticle
);
// polar pair energy
customGbviForce
.
addEnergyTerm
(
"-138.935485*(1/soluteDielectric-1/solventDielectric)*q1*q2/f;"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"
,
CustomGBForce
::
ParticlePairNoExclusions
);
#else
customGbviForce
.
addComputedValue
(
"V"
,
" uL - lL + factor3/(radius1*radius1*radius1);"
"uL = 1.5*x2uI*(0.25*rI-0.33333*xuI+0.125*(r2-S2)*rI*x2uI);"
"lL = 1.5*x2lI*(0.25*rI-0.33333*xlI+0.125*(r2-S2)*rI*x2lI);"
"x2lI = 1.0/(xl*xl);"
"xlI = 1.0/(xl);"
"xuI = 1.0/(xu);"
"x2uI = 1.0/(xu*xu);"
"xu = (r+scaleFactor2);"
"rI = 1.0/(r);"
"r2 = (r*r);"
"xl = factor1*lMax + factor2*xuu + factor3*(r-scaleFactor2);"
"xuu = (r+scaleFactor2);"
"S2 = (scaleFactor2*scaleFactor2);"
"factor1 = step(r-absRadiusScaleDiff);"
"absRadiusScaleDiff = abs(radiusScaleDiff);"
"radiusScaleDiff = (radius1-scaleFactor2);"
"factor2 = step(radius1-scaleFactor2-r);"
"factor3 = step(scaleFactor2-radius1-r);"
"lMax = max(radius1,r-scaleFactor2);"
,
CustomGBForce
::
ParticlePairNoExclusions
);
customGbviForce
.
addComputedValue
(
"B"
,
"(1.0/(radius*radius*radius)-V)^(-0.33333333)"
,
CustomGBForce
::
SingleParticle
);
// nonpolar term + polar self energy
customGbviForce
.
addEnergyTerm
(
"(-138.935485*0.5*((1.0/soluteDielectric)-(1.0/solventDielectric))*q^2/B)-((1.0/soluteDielectric)-(1.0/solventDielectric))*((gamma*(radius/B)^3))"
,
CustomGBForce
::
SingleParticle
);
// polar pair energy
customGbviForce
.
addEnergyTerm
(
"-138.935485*(1/soluteDielectric-1/solventDielectric)*q1*q2/f;"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"
,
CustomGBForce
::
ParticlePairNoExclusions
);
#endif
// load energies
loadGbviParameters
(
gbviSoftcoreForce
,
customGbviForce
,
log
);
return
;
}
void
testGBVISoftcore
(
MapStringToDouble
inputArgumentMap
,
FILE
*
log
){
double
lambda1
=
1.0
;
double
lambda2
=
1.0
;
int
nonbondedMethod
=
0
;
int
numMolecules
=
1
;
int
numParticlesPerMolecule
=
2
;
int
useQuinticSpline
=
1
;
int
applyAssert
=
1
;
int
positionPlacementMethod
=
0
;
int
serialize
=
0
;
double
boxSize
=
10.0
;
double
relativeTolerance
=
1.0e-04
;
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"lambda1"
,
lambda1
);
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"lambda2"
,
lambda2
);
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"boxSize"
,
boxSize
);
double
cutoffDistance
=
boxSize
*
0.4
;;
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"cutoffDistance"
,
cutoffDistance
);
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"relativeTolerance"
,
relativeTolerance
);
setIntFromMapStringToDouble
(
inputArgumentMap
,
"positionPlacementMethod"
,
positionPlacementMethod
)
;
setIntFromMapStringToDouble
(
inputArgumentMap
,
"nonbondedMethod"
,
nonbondedMethod
);
setIntFromMapStringToDouble
(
inputArgumentMap
,
"numMolecules"
,
numMolecules
);
setIntFromMapStringToDouble
(
inputArgumentMap
,
"numParticlesPerMolecule"
,
numParticlesPerMolecule
);
setIntFromMapStringToDouble
(
inputArgumentMap
,
"serialize"
,
serialize
);
int
numParticles
=
numMolecules
*
numParticlesPerMolecule
;
int
includeGbvi
=
1
;
double
reactionFieldDielectric
=
80.0
;
if
(
log
){
double
particleDensity
=
static_cast
<
double
>
(
numParticles
)
/
(
boxSize
*
boxSize
*
boxSize
);
double
particleCube
=
pow
(
particleDensity
,
(
-
1.0
/
3.0
)
);
(
void
)
fprintf
(
log
,
"
\n
--------------------------------------------------------------------------------------
\n
"
);
(
void
)
fprintf
(
log
,
"Input arguments
\n
"
);
(
void
)
fflush
(
log
);
(
void
)
fprintf
(
log
,
" includeGbvi %d
\n
"
,
includeGbvi
);
(
void
)
fprintf
(
log
,
" nonbondedMethod %d
\n
"
,
nonbondedMethod
);
(
void
)
fprintf
(
log
,
" numParticles %d
\n
"
,
numParticles
);
(
void
)
fprintf
(
log
,
" numMolecules %d
\n
"
,
numMolecules
);
(
void
)
fprintf
(
log
,
" numParticlesPerMolecule %d
\n
"
,
numParticlesPerMolecule
);
(
void
)
fprintf
(
log
,
" useQuinticSpline %d
\n
"
,
useQuinticSpline
);
(
void
)
fprintf
(
log
,
" positionPlacementMethod %d
\n
"
,
positionPlacementMethod
);
#ifdef USE_SOFTCORE
(
void
)
fprintf
(
log
,
" lambda1 %8.3f
\n
"
,
lambda1
);
(
void
)
fprintf
(
log
,
" lambda2 %8.3f
\n
"
,
lambda2
);
#endif
(
void
)
fprintf
(
log
,
" boxSize %8.3f
\n
"
,
boxSize
);
(
void
)
fprintf
(
log
,
" cutoffDistance %8.3f
\n
"
,
cutoffDistance
);
(
void
)
fprintf
(
log
,
" reactionFieldDielectric %8.3f
\n
"
,
reactionFieldDielectric
);
(
void
)
fprintf
(
log
,
" relativeTolerance %8.1e
\n
"
,
relativeTolerance
);
(
void
)
fprintf
(
log
,
" particleDensity %8.2e
\n
"
,
particleDensity
);
(
void
)
fprintf
(
log
,
" particleCube %8.2e
\n
"
,
particleCube
);
}
// set positions
vector
<
Vec3
>
positions
(
numParticles
);
OpenMM_SFMT
::
SFMT
sfmt
;
init_gen_rand
(
0
,
sfmt
);
PositionGenerator
positionGenerator
(
numMolecules
,
numParticlesPerMolecule
,
boxSize
);
if
(
log
){
positionGenerator
.
setLog
(
log
);
}
if
(
positionPlacementMethod
==
1
){
positionGenerator
.
setPositions
(
PositionGenerator
::
SimpleGrid
,
sfmt
,
positions
);
}
else
{
positionGenerator
.
setBondDistance
(
0.3
);
positionGenerator
.
setPositions
(
PositionGenerator
::
Random
,
sfmt
,
positions
);
}
// create GBSAGBVISoftcoreForce and populate w/ parameters
#ifdef USE_SOFTCORE
GBVISoftcoreForce
*
gbviSoftcoreForce
=
new
GBVISoftcoreForce
();
#else
GBVIForce
*
gbviSoftcoreForce
=
new
GBVIForce
();
#endif
gbviSoftcoreForce
->
setSolventDielectric
(
78.3
);
//gbviSoftcoreForce.setSolventDielectric( 1.0e+10 );
//gbviSoftcoreForce.setSolventDielectric( 1.0 );
gbviSoftcoreForce
->
setSoluteDielectric
(
1.0
);
gbviSoftcoreForce
->
setCutoffDistance
(
cutoffDistance
);
const
int
numberOfParameters
=
4
;
const
int
ChargeIndex
=
0
;
const
int
SigmaIndex
=
1
;
const
int
GammaIndex
=
2
;
const
int
LambdaIndex
=
3
;
std
::
vector
<
double
>
parameterLowerBound
(
numberOfParameters
,
0.0
);
double
fixedCharge
=
1.0
;
parameterLowerBound
[
ChargeIndex
]
=
fixedCharge
;
// charge
parameterLowerBound
[
SigmaIndex
]
=
0.1
;
// sigma
parameterLowerBound
[
GammaIndex
]
=
0.1
;
// gamma
parameterLowerBound
[
LambdaIndex
]
=
lambda1
;
// lambda
std
::
vector
<
double
>
parameterUpperBound
(
parameterLowerBound
);
parameterUpperBound
[
ChargeIndex
]
=
fixedCharge
;
// charge
parameterUpperBound
[
SigmaIndex
]
=
0.3
;
// sigma
parameterUpperBound
[
GammaIndex
]
=
40.0
;
// gamma
std
::
vector
<
double
>
parameters
(
numberOfParameters
);
double
charge
=
fixedCharge
;
for
(
int
ii
=
0
;
ii
<
numMolecules
;
ii
++
)
{
charge
*=
-
1.0
;
double
lambda
=
ii
<
(
numMolecules
/
2
)
?
lambda1
:
lambda2
;
randomizeParameters
(
parameterLowerBound
,
parameterUpperBound
,
sfmt
,
parameters
);
#ifdef USE_SOFTCORE
gbviSoftcoreForce
->
addParticle
(
charge
,
parameters
[
SigmaIndex
],
parameters
[
GammaIndex
],
lambda
);
#else
gbviSoftcoreForce
->
addParticle
(
charge
,
parameters
[
SigmaIndex
],
parameters
[
GammaIndex
]
);
#endif
int
baseParticleIndex
=
ii
*
numParticlesPerMolecule
;
for
(
int
jj
=
1
;
jj
<
numParticlesPerMolecule
;
jj
++
)
{
// alternate charges
charge
*=
-
1.0
;
randomizeParameters
(
parameterLowerBound
,
parameterUpperBound
,
sfmt
,
parameters
);
#ifdef USE_SOFTCORE
gbviSoftcoreForce
->
addParticle
(
charge
,
parameters
[
SigmaIndex
],
parameters
[
GammaIndex
],
lambda
);
#else
gbviSoftcoreForce
->
addParticle
(
charge
,
parameters
[
SigmaIndex
],
parameters
[
GammaIndex
]
);
#endif
#if IMPLICIT_SOLVENT == GBVI_FLAG
double
bondDistance
=
positionGenerator
.
getDistance
(
baseParticleIndex
,
baseParticleIndex
+
jj
,
positions
);
gbviSoftcoreForce
->
addBond
(
baseParticleIndex
,
baseParticleIndex
+
jj
,
bondDistance
);
#endif
}
// alternate charge if numParticlesPerMolecule is odd
if
(
(
numParticlesPerMolecule
%
2
)
){
charge
*=
-
1.0
;
}
}
// Create system
System
standardSystem
;
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
standardSystem
.
addParticle
(
1.0
);
}
standardSystem
.
setDefaultPeriodicBoxVectors
(
Vec3
(
boxSize
,
0
,
0
),
Vec3
(
0
,
boxSize
,
0
),
Vec3
(
0
,
0
,
boxSize
));
standardSystem
.
addForce
(
gbviSoftcoreForce
);
// copy system and forces
System
systemCopy
;
copySystem
(
standardSystem
,
systemCopy
);
CustomGBForce
*
customGbviForce
=
new
CustomGBForce
();
createCustomGBVI
(
*
customGbviForce
,
*
gbviSoftcoreForce
,
log
);
systemCopy
.
addForce
(
customGbviForce
);
// perform comparison
std
::
stringstream
idString
;
idString
<<
"Nb "
<<
nonbondedMethod
<<
" l2 "
<<
std
::
fixed
<<
setprecision
(
2
)
<<
lambda2
;
runSystemComparisonTest
(
standardSystem
,
systemCopy
,
"Reference"
,
"Reference"
,
positions
,
inputArgumentMap
,
idString
.
str
(),
log
);
// serialize
std
::
stringstream
baseFileName
;
if
(
serialize
){
baseFileName
<<
"_N"
<<
positions
.
size
();
baseFileName
<<
"_Nb"
<<
nonbondedMethod
;
serializeSystemAndPositions
(
standardSystem
,
positions
,
baseFileName
.
str
(),
log
);
}
}
int
main
()
{
try
{
//FILE* log = stderr;
FILE
*
log
=
NULL
;
//testSingleParticle();
//testEnergyEthaneSwitchingFunction( 0 );
//testEnergyEthaneSwitchingFunction( 1 );
MapStringToDouble
inputArgumentMap
;
inputArgumentMap
[
"lambda2"
]
=
0.5
;
inputArgumentMap
[
"nonbondedMethod"
]
=
0
;
inputArgumentMap
[
"numMolecules"
]
=
10
;
inputArgumentMap
[
"boxSize"
]
=
5.0
;
inputArgumentMap
[
"positionPlacementMethod"
]
=
0
;
inputArgumentMap
[
"cutoffDistance"
]
=
0.3
*
inputArgumentMap
[
"boxSize"
];
//inputArgumentMap["cutoffDistance"] = 1.0;
inputArgumentMap
[
"relativeTolerance"
]
=
5.0e-04
;
inputArgumentMap
[
"serialize"
]
=
1
;
//inputArgumentMap["numParticlesPerMolecule"] = 2;
testGBVISoftcore
(
inputArgumentMap
,
log
);
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
plugins/freeEnergy/platforms/reference/tests/TestReferenceLJSoftcoreForce.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2008-2009 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. *
* -------------------------------------------------------------------------- */
/**
* This tests all the different force terms in the reference implementation of CustomGBForce.
*/
#include "openmm/internal/AssertionUtilities.h"
#include "sfmt/SFMT.h"
#include "openmm/Context.h"
#include "openmm/CustomBondForce.h"
#include "openmm/CustomNonbondedForce.h"
#include "openmm/NonbondedForce.h"
#include "openmm/NonbondedSoftcoreForce.h"
#include "openmm/System.h"
#include "openmm/VerletIntegrator.h"
#include <iostream>
#include <vector>
#include <algorithm>
using
namespace
OpenMM
;
using
namespace
std
;
const
double
TOL
=
1e-5
;
static
const
int
NoCutoff
=
0
;
static
const
int
CutoffNonPeriodic
=
1
;
static
const
int
CutoffPeriodic
=
2
;
void
testNonbondedSoftcore
(
double
lambda1
,
double
lambda2
,
int
nonbondedMethod
){
const
int
numMolecules
=
70
;
const
int
numParticles
=
numMolecules
*
2
;
const
double
boxSize
=
10.0
;
const
double
reactionFieldDielectric
=
80.0
;
const
double
cutoffDistance
=
0.4
*
boxSize
;
// Create two systems: one with a NonbondedSoftcoreForce, and one using a CustomNonbondedForce to implement the same interaction.
System
standardSystem
;
System
customSystem
;
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
standardSystem
.
addParticle
(
1.0
);
customSystem
.
addParticle
(
1.0
);
}
standardSystem
.
setDefaultPeriodicBoxVectors
(
Vec3
(
boxSize
,
0
,
0
),
Vec3
(
0
,
boxSize
,
0
),
Vec3
(
0
,
0
,
boxSize
));
customSystem
.
setDefaultPeriodicBoxVectors
(
Vec3
(
boxSize
,
0
,
0
),
Vec3
(
0
,
boxSize
,
0
),
Vec3
(
0
,
0
,
boxSize
));
NonbondedSoftcoreForce
*
nonbondedSoftcoreForce
=
new
NonbondedSoftcoreForce
();
CustomNonbondedForce
*
customNonbonded
;
CustomBondForce
*
customBond
;
if
(
nonbondedMethod
==
NoCutoff
){
nonbondedSoftcoreForce
->
setNonbondedMethod
(
NonbondedSoftcoreForce
::
NoCutoff
);
customNonbonded
=
new
CustomNonbondedForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q/r;"
"q=q1*q2;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda);"
"sigma=0.5*(sigma1+sigma2);"
"eps=sqrt(eps1*eps2);"
"lambda=min(lambda1,lambda2)"
);
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
NoCutoff
);
customBond
=
new
CustomBondForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q/r;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda)"
);
}
else
{
nonbondedSoftcoreForce
->
setCutoffDistance
(
cutoffDistance
);
nonbondedSoftcoreForce
->
setReactionFieldDielectric
(
reactionFieldDielectric
);
if
(
nonbondedMethod
==
CutoffNonPeriodic
){
nonbondedSoftcoreForce
->
setNonbondedMethod
(
NonbondedSoftcoreForce
::
CutoffNonPeriodic
);
}
else
{
nonbondedSoftcoreForce
->
setNonbondedMethod
(
NonbondedSoftcoreForce
::
CutoffPeriodic
);
}
customNonbonded
=
new
CustomNonbondedForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q*(1.0/r+(krf*r*r)-crf);"
"q=q1*q2;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda);"
"sigma=0.5*(sigma1+sigma2);"
"eps=sqrt(eps1*eps2);"
"lambda=min(lambda1,lambda2)"
);
customBond
=
new
CustomBondForce
(
"withinCutoff*(lambda*4*eps*(dem^2-dem)+138.935456*q*(1.0/r+(krf*r*r)-crf));"
"withinCutoff=step(cutoff-r);"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda)"
);
customNonbonded
->
setCutoffDistance
(
cutoffDistance
);
if
(
nonbondedMethod
==
CutoffNonPeriodic
){
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
CutoffNonPeriodic
);
}
else
{
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
CutoffPeriodic
);
}
double
eps2
=
(
reactionFieldDielectric
-
1.0
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
double
kValue
=
eps2
/
(
cutoffDistance
*
cutoffDistance
*
cutoffDistance
);
customNonbonded
->
addGlobalParameter
(
"krf"
,
kValue
);
customBond
->
addGlobalParameter
(
"krf"
,
kValue
);
double
cValue
=
(
1.0
/
cutoffDistance
)
*
(
3.0
*
reactionFieldDielectric
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
customNonbonded
->
addGlobalParameter
(
"crf"
,
cValue
);
customBond
->
addGlobalParameter
(
"crf"
,
cValue
);
customBond
->
addGlobalParameter
(
"cutoff"
,
cutoffDistance
);
}
customNonbonded
->
addPerParticleParameter
(
"q"
);
customNonbonded
->
addPerParticleParameter
(
"sigma"
);
customNonbonded
->
addPerParticleParameter
(
"eps"
);
customNonbonded
->
addPerParticleParameter
(
"lambda"
);
customBond
->
addPerBondParameter
(
"q"
);
customBond
->
addPerBondParameter
(
"sigma"
);
customBond
->
addPerBondParameter
(
"eps"
);
customBond
->
addPerBondParameter
(
"lambda"
);
vector
<
Vec3
>
positions
(
numParticles
);
vector
<
Vec3
>
velocities
(
numParticles
);
OpenMM_SFMT
::
SFMT
sfmt
;
init_gen_rand
(
0
,
sfmt
);
vector
<
double
>
params
(
4
);
// periodic boundary conditions not possible w/ CustomBond?
int
includeExceptions
=
nonbondedMethod
==
CutoffPeriodic
?
0
:
1
;
for
(
int
i
=
0
;
i
<
numMolecules
;
i
++
)
{
if
(
i
<
numMolecules
/
2
)
{
double
charge
=
1.0
;
nonbondedSoftcoreForce
->
addParticle
(
charge
,
0.2
,
0.5
,
lambda1
);
nonbondedSoftcoreForce
->
addParticle
(
-
charge
,
0.1
,
0.5
,
lambda1
);
params
[
0
]
=
charge
;
params
[
1
]
=
0.2
;
params
[
2
]
=
0.5
;
params
[
3
]
=
lambda1
;
customNonbonded
->
addParticle
(
params
);
params
[
0
]
=
-
charge
;
params
[
1
]
=
0.1
;
customNonbonded
->
addParticle
(
params
);
if
(
includeExceptions
&&
i
&&
((
i
%
4
)
==
0
)
){
vector
<
double
>
bondParams
(
4
);
nonbondedSoftcoreForce
->
addException
(
i
-
4
,
i
,
charge
*
charge
,
0.2
,
0.5
,
false
,
lambda1
);
customNonbonded
->
addExclusion
(
i
-
4
,
i
);
bondParams
[
0
]
=
charge
*
charge
;
bondParams
[
1
]
=
0.2
;
bondParams
[
2
]
=
0.5
;
bondParams
[
3
]
=
lambda1
;
customBond
->
addBond
(
i
-
4
,
i
,
bondParams
);
}
}
else
{
double
charge
=
1.2
;
nonbondedSoftcoreForce
->
addParticle
(
charge
,
0.2
,
0.8
,
lambda2
);
nonbondedSoftcoreForce
->
addParticle
(
-
charge
,
0.1
,
0.8
,
lambda2
);
params
[
0
]
=
charge
;
params
[
1
]
=
0.2
;
params
[
2
]
=
0.8
;
params
[
3
]
=
lambda2
;
customNonbonded
->
addParticle
(
params
);
params
[
0
]
=
-
charge
;
params
[
1
]
=
0.1
;
customNonbonded
->
addParticle
(
params
);
if
(
includeExceptions
&&
i
&&
((
i
%
4
)
==
0
)
){
vector
<
double
>
bondParams
(
4
);
nonbondedSoftcoreForce
->
addException
(
i
-
4
,
i
,
charge
*
charge
,
0.2
,
0.5
,
false
,
lambda1
);
customNonbonded
->
addExclusion
(
i
-
4
,
i
);
bondParams
[
0
]
=
charge
*
charge
;
bondParams
[
1
]
=
0.2
;
bondParams
[
2
]
=
0.5
;
bondParams
[
3
]
=
lambda2
;
customBond
->
addBond
(
i
-
4
,
i
,
bondParams
);
}
}
positions
[
2
*
i
]
=
Vec3
(
boxSize
*
genrand_real2
(
sfmt
),
boxSize
*
genrand_real2
(
sfmt
),
boxSize
*
genrand_real2
(
sfmt
));
positions
[
2
*
i
+
1
]
=
Vec3
(
positions
[
2
*
i
][
0
]
+
1.0
,
positions
[
2
*
i
][
1
],
positions
[
2
*
i
][
2
]);
velocities
[
2
*
i
]
=
Vec3
(
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
));
velocities
[
2
*
i
+
1
]
=
Vec3
(
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
));
}
standardSystem
.
addForce
(
nonbondedSoftcoreForce
);
customSystem
.
addForce
(
customNonbonded
);
customSystem
.
addForce
(
customBond
);
VerletIntegrator
integrator1
(
0.01
);
VerletIntegrator
integrator2
(
0.01
);
Context
context1
(
standardSystem
,
integrator1
,
Platform
::
getPlatformByName
(
"Reference"
));
context1
.
setPositions
(
positions
);
context1
.
setVelocities
(
velocities
);
State
state1
=
context1
.
getState
(
State
::
Forces
|
State
::
Energy
);
Context
context2
(
customSystem
,
integrator2
,
Platform
::
getPlatformByName
(
"Reference"
));
context2
.
setPositions
(
positions
);
context2
.
setVelocities
(
velocities
);
State
state2
=
context2
.
getState
(
State
::
Forces
|
State
::
Energy
);
// (void) fprintf( stderr, "%10.1f %10.1f %15.7e %15.7e\n", lambda1, lambda2, state1.getPotentialEnergy(), state2.getPotentialEnergy());
ASSERT_EQUAL_TOL
(
state1
.
getPotentialEnergy
(),
state2
.
getPotentialEnergy
(),
1e-4
);
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
ASSERT_EQUAL_VEC
(
state1
.
getForces
()[
i
],
state2
.
getForces
()[
i
],
1e-4
);
}
}
int
main
()
{
try
{
// test various combinations of lambdas and boundary conditions/cutoffs
testNonbondedSoftcore
(
1.0
,
1.0
,
NoCutoff
);
testNonbondedSoftcore
(
1.0
,
0.0
,
NoCutoff
);
testNonbondedSoftcore
(
1.0
,
0.5
,
NoCutoff
);
testNonbondedSoftcore
(
0.0
,
0.0
,
NoCutoff
);
testNonbondedSoftcore
(
1.0
,
1.0
,
CutoffNonPeriodic
);
testNonbondedSoftcore
(
1.0
,
0.0
,
CutoffNonPeriodic
);
testNonbondedSoftcore
(
1.0
,
0.5
,
CutoffNonPeriodic
);
testNonbondedSoftcore
(
0.0
,
0.0
,
CutoffNonPeriodic
);
testNonbondedSoftcore
(
1.0
,
1.0
,
CutoffPeriodic
);
testNonbondedSoftcore
(
1.0
,
0.0
,
CutoffPeriodic
);
testNonbondedSoftcore
(
1.0
,
0.5
,
CutoffPeriodic
);
testNonbondedSoftcore
(
0.0
,
0.0
,
CutoffPeriodic
);
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
plugins/freeEnergy/platforms/reference/tests/TestReferenceOBCSoftcoreForce.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2008-2009 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. *
* -------------------------------------------------------------------------- */
/**
* This tests all the different force terms in the reference implementation of CustomGBForce.
*/
#include "openmm/internal/AssertionUtilities.h"
#include "sfmt/SFMT.h"
#include "openmm/Context.h"
#include "openmm/CustomGBForce.h"
#include "openmm/GBSAOBCSoftcoreForce.h"
#include "openmm/System.h"
#include "openmm/VerletIntegrator.h"
#include <iostream>
#include <vector>
#include <algorithm>
using
namespace
OpenMM
;
using
namespace
std
;
const
double
TOL
=
1e-5
;
void
testOBCSoftcore
(
double
lambda1
,
double
lambda2
){
const
int
numMolecules
=
70
;
const
int
numParticles
=
numMolecules
*
2
;
const
double
boxSize
=
10.0
;
// Create two systems: one with a GBSAOBCSoftcoreForce, and one using a CustomGBForce to implement the same interaction.
System
standardSystem
;
System
customSystem
;
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
standardSystem
.
addParticle
(
1.0
);
customSystem
.
addParticle
(
1.0
);
}
GBSAOBCSoftcoreForce
*
obc
=
new
GBSAOBCSoftcoreForce
();
CustomGBForce
*
custom
=
new
CustomGBForce
();
custom
->
addPerParticleParameter
(
"q"
);
custom
->
addPerParticleParameter
(
"radius"
);
custom
->
addPerParticleParameter
(
"scale"
);
custom
->
addPerParticleParameter
(
"lambda"
);
custom
->
addGlobalParameter
(
"solventDielectric"
,
obc
->
getSolventDielectric
());
custom
->
addGlobalParameter
(
"soluteDielectric"
,
obc
->
getSoluteDielectric
());
custom
->
addComputedValue
(
"I"
,
"lambda2*step(r+sr2-or1)*0.5*(1/L-1/U+0.25*(1/U^2-1/L^2)*(r-sr2*sr2/r)+0.5*log(L/U)/r+C);"
"U=r+sr2;"
"C=2*(1/or1-1/L)*step(sr2-r-or1);"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-0.009; or2 = radius2-0.009"
,
CustomGBForce
::
ParticlePairNoExclusions
);
custom
->
addComputedValue
(
"B"
,
"1/(1/or-tanh(1*psi-0.8*psi^2+4.85*psi^3)/radius);"
"psi=I*or; or=radius-0.009"
,
CustomGBForce
::
SingleParticle
);
custom
->
addEnergyTerm
(
"lambda*28.3919551*(radius+0.14)^2*(radius/B)^6-0.5*138.935485*(1/soluteDielectric-1/solventDielectric)*q^2/B"
,
CustomGBForce
::
SingleParticle
);
custom
->
addEnergyTerm
(
"-138.935485*(1/soluteDielectric-1/solventDielectric)*q1*q2/f;"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"
,
CustomGBForce
::
ParticlePairNoExclusions
);
vector
<
Vec3
>
positions
(
numParticles
);
vector
<
Vec3
>
velocities
(
numParticles
);
OpenMM_SFMT
::
SFMT
sfmt
;
init_gen_rand
(
0
,
sfmt
);
vector
<
double
>
params
(
4
);
double
charge
=
1.0
;
for
(
int
i
=
0
;
i
<
numMolecules
;
i
++
)
{
if
(
i
<
numMolecules
/
2
)
{
obc
->
addParticle
(
charge
*
lambda1
,
0.2
,
0.5
,
lambda1
);
obc
->
addParticle
(
-
charge
*
lambda1
,
0.1
,
0.5
,
lambda1
);
params
[
0
]
=
charge
*
lambda1
;
params
[
1
]
=
0.2
;
params
[
2
]
=
0.5
;
params
[
3
]
=
lambda1
;
custom
->
addParticle
(
params
);
params
[
0
]
=
-
charge
*
lambda1
;
params
[
1
]
=
0.1
;
custom
->
addParticle
(
params
);
}
else
{
obc
->
addParticle
(
charge
*
lambda2
,
0.2
,
0.8
,
lambda2
);
obc
->
addParticle
(
-
charge
*
lambda2
,
0.1
,
0.8
,
lambda2
);
params
[
0
]
=
charge
*
lambda2
;
params
[
1
]
=
0.2
;
params
[
2
]
=
0.8
;
params
[
3
]
=
lambda2
;
custom
->
addParticle
(
params
);
params
[
0
]
=
-
charge
*
lambda2
;
params
[
1
]
=
0.1
;
custom
->
addParticle
(
params
);
}
positions
[
2
*
i
]
=
Vec3
(
boxSize
*
genrand_real2
(
sfmt
),
boxSize
*
genrand_real2
(
sfmt
),
boxSize
*
genrand_real2
(
sfmt
));
positions
[
2
*
i
+
1
]
=
Vec3
(
positions
[
2
*
i
][
0
]
+
1.0
,
positions
[
2
*
i
][
1
],
positions
[
2
*
i
][
2
]);
velocities
[
2
*
i
]
=
Vec3
(
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
));
velocities
[
2
*
i
+
1
]
=
Vec3
(
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
),
genrand_real2
(
sfmt
));
}
//custom->setNonbondedMethod(customMethod);
standardSystem
.
addForce
(
obc
);
customSystem
.
addForce
(
custom
);
VerletIntegrator
integrator1
(
0.01
);
VerletIntegrator
integrator2
(
0.01
);
Context
context1
(
standardSystem
,
integrator1
,
Platform
::
getPlatformByName
(
"Reference"
));
context1
.
setPositions
(
positions
);
context1
.
setVelocities
(
velocities
);
State
state1
=
context1
.
getState
(
State
::
Forces
|
State
::
Energy
);
Context
context2
(
customSystem
,
integrator2
,
Platform
::
getPlatformByName
(
"Reference"
));
context2
.
setPositions
(
positions
);
context2
.
setVelocities
(
velocities
);
State
state2
=
context2
.
getState
(
State
::
Forces
|
State
::
Energy
);
ASSERT_EQUAL_TOL
(
state1
.
getPotentialEnergy
(),
state2
.
getPotentialEnergy
(),
1e-4
);
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
ASSERT_EQUAL_VEC
(
state1
.
getForces
()[
i
],
state2
.
getForces
()[
i
],
1e-4
);
}
}
int
main
()
{
try
{
// test various combinations of lambdas
testOBCSoftcore
(
1.0
,
1.0
);
testOBCSoftcore
(
1.0
,
0.0
);
testOBCSoftcore
(
1.0
,
0.5
);
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
plugins/freeEnergy/platforms/reference/tests/TestReferenceSoftcoreForce.h
deleted
100644 → 0
View file @
c775bd19
#ifndef TEST_CUDA_SOFTCORE_H_
#define TEST_CUDA_SOFTCORE_H_
/* -------------------------------------------------------------------------- *
* 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) 2008-2009 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. *
* -------------------------------------------------------------------------- */
/**
* Utility methods shared across unit tests
*/
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/Context.h"
#include "openmm/System.h"
#include "../src/SimTKUtilities/SimTKOpenMMRealType.h"
#include "OpenMM.h"
#include "OpenMMFreeEnergy.h"
#include "openmm/freeEnergyKernels.h"
#include "sfmt/SFMT.h"
#include "openmm/VerletIntegrator.h"
#ifdef OPENMM_SERIALIZE
#include "../../../../../serialization/include/openmm/serialization/SerializationProxy.h"
#include "../../../../../serialization/include/openmm/serialization/SerializationNode.h"
#include "../../../../../serialization/include/openmm/serialization/XmlSerializer.h"
//extern "C" void registerSerializationProxies();
//extern "C" void registerAmoebaSerializationProxies();
#endif
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <typeinfo>
extern
"C"
void
registerFreeEnergyCudaKernelFactories
();
using
namespace
OpenMM
;
using
namespace
std
;
const
double
TOL
=
1e-5
;
static
const
int
NoCutoff
=
0
;
static
const
int
CutoffNonPeriodic
=
1
;
static
const
int
CutoffPeriodic
=
2
;
typedef
std
::
vector
<
std
::
string
>
StringVector
;
typedef
StringVector
::
iterator
StringVectorI
;
typedef
StringVector
::
const_iterator
StringVectorCI
;
typedef
std
::
vector
<
StringVector
>
StringVectorVector
;
typedef
std
::
vector
<
int
>
IntVector
;
typedef
IntVector
::
iterator
IntVectorI
;
typedef
IntVector
::
const_iterator
IntVectorCI
;
typedef
std
::
vector
<
IntVector
>
IntVectorVector
;
typedef
std
::
vector
<
double
>
DoubleVector
;
typedef
DoubleVector
::
iterator
DoubleVectorI
;
typedef
DoubleVector
::
const_iterator
DoubleVectorCI
;
typedef
std
::
vector
<
DoubleVector
>
DoubleVectorVector
;
// the following are used in parsing parameter file
typedef
std
::
vector
<
std
::
string
>
StringVector
;
typedef
StringVector
::
iterator
StringVectorI
;
typedef
StringVector
::
const_iterator
StringVectorCI
;
typedef
std
::
vector
<
StringVector
>
VectorStringVector
;
typedef
VectorStringVector
::
iterator
VectorStringVectorI
;
typedef
VectorStringVector
::
const_iterator
VectorStringVectorCI
;
typedef
std
::
vector
<
std
::
vector
<
double
>
>
VectorOfVectors
;
typedef
VectorOfVectors
::
iterator
VectorOfVectorsI
;
typedef
VectorOfVectors
::
const_iterator
VectorOfVectorsCI
;
typedef
std
::
map
<
int
,
int
>
MapIntInt
;
typedef
MapIntInt
::
iterator
MapIntIntI
;
typedef
MapIntInt
::
const_iterator
MapIntIntCI
;
typedef
std
::
map
<
double
,
int
>
MapDoubleToInt
;
typedef
MapDoubleToInt
::
iterator
MapDoubleToIntI
;
typedef
MapDoubleToInt
::
const_iterator
MapDoubleToIntCI
;
typedef
std
::
map
<
std
::
string
,
VectorOfVectors
>
MapStringVectorOfVectors
;
typedef
MapStringVectorOfVectors
::
iterator
MapStringVectorOfVectorsI
;
typedef
MapStringVectorOfVectors
::
const_iterator
MapStringVectorOfVectorsCI
;
typedef
std
::
map
<
std
::
string
,
StringVector
>
MapStringStringVector
;
typedef
MapStringStringVector
::
iterator
MapStringStringVectorI
;
typedef
MapStringStringVector
::
const_iterator
MapStringStringVectorCI
;
typedef
std
::
map
<
std
::
string
,
std
::
string
>
MapStringString
;
typedef
MapStringString
::
iterator
MapStringStringI
;
typedef
MapStringString
::
const_iterator
MapStringStringCI
;
typedef
std
::
map
<
std
::
string
,
std
::
string
>
MapStringToInt
;
typedef
MapStringToInt
::
iterator
MapStringToIntI
;
typedef
MapStringToInt
::
const_iterator
MapStringToIntCI
;
typedef
std
::
vector
<
std
::
map
<
std
::
string
,
std
::
string
>
>
VectorMapStringString
;
typedef
VectorMapStringString
::
iterator
VectorMapStringStringI
;
typedef
VectorMapStringString
::
const_iterator
VectorMapStringStringCI
;
typedef
std
::
map
<
std
::
string
,
int
>
MapStringInt
;
typedef
MapStringInt
::
iterator
MapStringIntI
;
typedef
MapStringInt
::
const_iterator
MapStringIntCI
;
typedef
std
::
map
<
std
::
string
,
std
::
vector
<
OpenMM
::
Vec3
>
>
MapStringVec3
;
typedef
MapStringVec3
::
iterator
MapStringVec3I
;
typedef
MapStringVec3
::
const_iterator
MapStringVec3CI
;
typedef
std
::
map
<
std
::
string
,
double
>
MapStringToDouble
;
typedef
MapStringToDouble
::
iterator
MapStringToDoubleI
;
typedef
MapStringToDouble
::
const_iterator
MapStringToDoubleCI
;
typedef
std
::
vector
<
MapStringToDouble
>
VectorOfMapStringToDouble
;
typedef
std
::
map
<
std
::
string
,
DoubleVector
>
MapStringToDoubleVector
;
typedef
MapStringToDoubleVector
::
iterator
MapStringToDoubleVectorI
;
typedef
MapStringToDoubleVector
::
const_iterator
MapStringToDoubleVectorCI
;
typedef
std
::
map
<
std
::
string
,
DoubleVector
>
MapStringToDoubleVector
;
typedef
std
::
map
<
std
::
string
,
Force
*>
MapStringForce
;
typedef
MapStringForce
::
iterator
MapStringForceI
;
typedef
MapStringForce
::
const_iterator
MapStringForceCI
;
typedef
std
::
map
<
int
,
IntVector
>
MapIntIntVector
;
typedef
MapIntIntVector
::
const_iterator
MapIntIntVectorCI
;
typedef
std
::
pair
<
int
,
int
>
IntIntPair
;
typedef
std
::
vector
<
IntIntPair
>
IntIntPairVector
;
typedef
IntIntPairVector
::
iterator
IntIntPairVectorI
;
typedef
IntIntPairVector
::
const_iterator
IntIntPairVectorCI
;
typedef
std
::
pair
<
int
,
double
>
IntDoublePair
;
typedef
std
::
vector
<
IntDoublePair
>
IntDoublePairVector
;
typedef
IntDoublePairVector
::
iterator
IntDoublePairVectorI
;
typedef
IntDoublePairVector
::
const_iterator
IntDoublePairVectorCI
;
class
PositionGenerator
{
public:
enum
GenerationMethod
{
/**
* Random positions
*/
Random
=
0
,
/**
* On grid
*/
SimpleGrid
=
1
,
};
PositionGenerator
(
int
numMolecules
,
int
numParticlesPerMolecule
,
double
boxSize
);
~
PositionGenerator
(
);
/**
* Set logging file reference
*
* @param log log
*
*/
void
setLog
(
FILE
*
log
);
/**
* Set positions
*
* @param method method placement
* @param positions output vector of positions
*
* @return nonzero if error detected; 0 otherwise
*/
int
setPositions
(
GenerationMethod
method
,
std
::
vector
<
Vec3
>&
positions
)
const
;
/**
* Set positions
*
* @param method method placement
* @param sfmt input random number generator
* @param positions output vector of positions
*
* @return nonzero if error detected; 0 otherwise
*/
int
setPositions
(
GenerationMethod
method
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
Vec3
>&
positions
)
const
;
/**
* Place particles on a grid
*
* @param origin origin
* @param boxDimensions box dimensions
* @param spacing spacing
* @param sfmt input random number generator
* @param array output vector of grid values
*
* @return -1 if particles will not fit on grid; 0 if they do
*/
int
setParticlesOnGrid
(
const
Vec3
&
origin
,
const
Vec3
&
boxDimensions
,
const
Vec3
&
spacing
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
Vec3
>&
array
)
const
;
/**
* Set bond distance
*
* @param bondDistance bond distance
*/
void
setBondDistance
(
double
bondDistance
);
/**
* Get bond distance
*
* @return bond distance
*/
double
getBondDistance
(
void
)
const
;
/**
* Get distance
*
* @param index1 index of first particle
* @param index2 index of second particle
* @param positions particle positions
*
* @return distance
*/
double
getDistance
(
int
index1
,
int
index2
,
const
std
::
vector
<
Vec3
>&
positions
)
const
;
/**
* Get distance assumming periodic boundary conditions
*
* @param index1 index of first particle
* @param index2 index of second particle
* @param positions particle positions
*
* @return distance
*/
double
getPeriodicDistance
(
int
index1
,
int
index2
,
const
std
::
vector
<
Vec3
>&
positions
)
const
;
/**
* Get settings
*
* @return info string
*/
std
::
string
getSettings
(
void
)
const
;
/**
* Get enclosing box
*
* @param positions input vector of positions
* @param enclosingBox output vector of enclosing box dimensions
*
*/
void
getEnclosingBox
(
const
std
::
vector
<
Vec3
>&
positions
,
Vec3
enclosingBox
[
2
]
)
const
;
/**
* Get sorted distances from particular position
*
* @param periodicBoundaryConditions if set, apply PBC
* @param positionIndex input position index
* @param positions input vector of positions
* @param sortVector on output sorted IntDoublePairVector
*
*/
void
getSortedDistances
(
int
periodicBoundaryConditions
,
int
positionIndex
,
const
std
::
vector
<
Vec3
>&
positions
,
IntDoublePairVector
&
sortVector
)
const
;
private:
int
_numMolecules
;
int
_numParticlesPerMolecule
;
int
_numParticles
;
int
_seed
;
double
_boxSize
;
double
_bondDistance
;
Vec3
_origin
;
Vec3
_boxDimensions
;
Vec3
_spacing
;
FILE
*
_log
;
};
PositionGenerator
::
PositionGenerator
(
int
numMolecules
,
int
numParticlesPerMolecule
,
double
boxSize
)
:
_numMolecules
(
numMolecules
),
_seed
(
0
),
_log
(
NULL
),
_bondDistance
(
0.1
),
_numParticlesPerMolecule
(
numParticlesPerMolecule
),
_numParticles
(
numMolecules
*
numParticlesPerMolecule
),
_boxSize
(
boxSize
),
_boxDimensions
(
Vec3
(
boxSize
,
boxSize
,
boxSize
)),
_origin
(
Vec3
(
0.0
,
0.0
,
0.0
))
{
double
particlesPerDimension
=
pow
(
static_cast
<
double
>
(
_numParticles
),
(
1.0
/
3.0
)
);
int
particlesPerDimensionI
=
static_cast
<
int
>
(
particlesPerDimension
+
0.999999
);
double
spacingPerDimension
=
_boxSize
/
particlesPerDimension
;
_spacing
[
0
]
=
spacingPerDimension
;
_spacing
[
1
]
=
spacingPerDimension
;
_spacing
[
2
]
=
spacingPerDimension
;
}
PositionGenerator
::~
PositionGenerator
(
){};
void
PositionGenerator
::
setBondDistance
(
double
bondDistance
){
_bondDistance
=
bondDistance
;
}
void
PositionGenerator
::
setLog
(
FILE
*
log
){
_log
=
log
;
}
double
PositionGenerator
::
getBondDistance
(
void
)
const
{
return
_bondDistance
;
}
double
PositionGenerator
::
getDistance
(
int
index1
,
int
index2
,
const
std
::
vector
<
Vec3
>&
positions
)
const
{
Vec3
delta
=
positions
[
index2
]
-
positions
[
index1
];
return
sqrt
(
delta
.
dot
(
delta
)
);
}
double
PositionGenerator
::
getPeriodicDistance
(
int
index1
,
int
index2
,
const
std
::
vector
<
Vec3
>&
positions
)
const
{
Vec3
delta
=
positions
[
index2
]
-
positions
[
index1
];
if
(
_boxSize
>
0.0
){
delta
[
0
]
-=
floor
(
delta
[
0
]
/
_boxSize
+
0.5
f
)
*
_boxSize
;
delta
[
1
]
-=
floor
(
delta
[
1
]
/
_boxSize
+
0.5
f
)
*
_boxSize
;
delta
[
2
]
-=
floor
(
delta
[
2
]
/
_boxSize
+
0.5
f
)
*
_boxSize
;
}
return
sqrt
(
delta
.
dot
(
delta
)
);
}
/**
* Get positions
*
* @param method method placement
* @param positions output vector of positions
*
* @return nonzero if error detected; 0 otherwise
*/
int
PositionGenerator
::
setPositions
(
GenerationMethod
method
,
std
::
vector
<
Vec3
>&
positions
)
const
{
OpenMM_SFMT
::
SFMT
sfmt
;
init_gen_rand
(
_seed
,
sfmt
);
return
setPositions
(
method
,
sfmt
,
positions
);
}
/**
* Get settings
*
* @return info string
*/
std
::
string
PositionGenerator
::
getSettings
(
void
)
const
{
std
::
stringstream
msg
;
msg
<<
"numMolecules "
<<
_numMolecules
<<
std
::
endl
;
msg
<<
"numParticlesPerMolecule "
<<
_numParticlesPerMolecule
<<
std
::
endl
;
msg
<<
"boxSize "
<<
_boxSize
<<
std
::
endl
;
msg
<<
"spacing "
<<
_spacing
[
0
]
<<
std
::
endl
;
msg
<<
"seed "
<<
_seed
<<
std
::
endl
;
return
msg
.
str
();
}
/**
* Get positions
*
* @param method method placement
* @param sfmt input random number generator
* @param positions output vector of positions
*
* @return nonzero if error detected; 0 otherwise
*/
int
PositionGenerator
::
setPositions
(
GenerationMethod
method
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
Vec3
>&
positions
)
const
{
int
errorFlag
=
0
;
positions
.
resize
(
_numParticles
);
if
(
method
==
Random
){
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
_numParticles
);
ii
+=
_numParticlesPerMolecule
){
positions
[
ii
]
=
Vec3
(
_boxSize
*
genrand_real2
(
sfmt
),
_boxSize
*
genrand_real2
(
sfmt
),
_boxSize
*
genrand_real2
(
sfmt
));
for
(
unsigned
int
jj
=
1
;
jj
<
static_cast
<
unsigned
int
>
(
_numParticlesPerMolecule
);
jj
++
)
{
positions
[
ii
+
jj
]
=
positions
[
ii
]
+
Vec3
(
_bondDistance
*
genrand_real2
(
sfmt
),
_bondDistance
*
genrand_real2
(
sfmt
),
_bondDistance
*
genrand_real2
(
sfmt
));
}
}
}
else
if
(
method
==
SimpleGrid
){
Vec3
origin
,
boxDimensions
,
spacing
;
std
::
stringstream
msg
;
if
(
_numParticlesPerMolecule
>
1
&&
_bondDistance
>
0.0
){
origin
=
Vec3
(
_bondDistance
,
_bondDistance
,
_bondDistance
);
double
particlesPerDimension
=
pow
(
static_cast
<
double
>
(
_numParticles
),
(
1.0
/
3.0
)
);
int
particlesPerDimensionI
=
static_cast
<
int
>
(
particlesPerDimension
+
0.999999
);
double
boxSize
=
(
_boxSize
-
2.0
*
_bondDistance
);
double
spacingPerDimension
=
boxSize
/
particlesPerDimension
;
spacing
=
Vec3
(
spacingPerDimension
,
spacingPerDimension
,
spacingPerDimension
);
boxDimensions
=
Vec3
(
boxSize
,
boxSize
,
boxSize
);
msg
<<
"Bond distance "
<<
_bondDistance
<<
std
::
endl
;
msg
<<
"particlesPerDimension "
<<
particlesPerDimension
<<
std
::
endl
;
msg
<<
"boxSize "
<<
boxSize
<<
std
::
endl
;
msg
<<
"spacingPerDimension "
<<
spacingPerDimension
<<
std
::
endl
;
}
else
{
origin
=
_origin
;
spacing
=
_spacing
;
boxDimensions
=
_boxDimensions
;
}
msg
<<
getSettings
()
<<
std
::
endl
;
if
(
_log
){
(
void
)
fprintf
(
_log
,
"SimpleGrid %s
\n
"
,
msg
.
str
().
c_str
()
);
}
errorFlag
=
setParticlesOnGrid
(
origin
,
boxDimensions
,
spacing
,
sfmt
,
positions
);
}
return
errorFlag
;
}
/**
* Place particles on a grid
*
* @param origin origin
* @param boxDimensions box dimensions
* @param spacing spacing
* @param array output vector of grid values
*
* @return -1 if particles will not fit on grid; 0 if they do
*/
int
PositionGenerator
::
setParticlesOnGrid
(
const
Vec3
&
origin
,
const
Vec3
&
boxDimensions
,
const
Vec3
&
spacing
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
Vec3
>&
array
)
const
{
Vec3
start
(
origin
);
if
(
array
.
size
()
!=
_numParticles
){
std
::
stringstream
msg
;
msg
<<
"PositionGenerator::setParticlesOnGrid position vector size="
<<
array
.
size
()
<<
" != numParticles="
<<
_numParticles
;
msg
<<
getSettings
();
throw
OpenMMException
(
msg
.
str
()
);
}
// place molecule centers on grid
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
_numParticles
);
ii
+=
_numParticlesPerMolecule
){
array
[
ii
]
=
Vec3
(
start
);
bool
done
=
false
;
for
(
unsigned
int
jj
=
0
;
jj
<
3
&&
!
done
;
jj
++
){
start
[
jj
]
+=
spacing
[
jj
];
if
(
start
[
jj
]
>
boxDimensions
[
jj
]
){
start
[
jj
]
=
origin
[
jj
];
}
else
{
done
=
true
;
}
}
if
(
!
done
){
std
::
stringstream
msg
;
msg
<<
"PositionGenerator::setParticlesOnGrid error in grid settings"
;
throw
OpenMMException
(
msg
.
str
()
);
}
}
// add molecule atoms
Vec3
bondOffset
(
0.05
,
0.05
,
0.05
);
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
_numMolecules
);
ii
++
){
int
molecularIndex
=
ii
*
_numParticlesPerMolecule
;
for
(
unsigned
int
jj
=
1
;
jj
<
static_cast
<
unsigned
int
>
(
_numParticlesPerMolecule
);
jj
++
){
array
[
molecularIndex
+
jj
]
=
array
[
molecularIndex
]
+
bondOffset
+
Vec3
(
_bondDistance
*
genrand_real2
(
sfmt
),
_bondDistance
*
genrand_real2
(
sfmt
),
_bondDistance
*
genrand_real2
(
sfmt
));
}
}
return
0
;
}
/**
* Get enclosing box
*
* @param positions input vector of positions
* @param enclosingBox output Vec3[2] of minimum enclosing box ranges
*
*/
void
PositionGenerator
::
getEnclosingBox
(
const
std
::
vector
<
Vec3
>&
positions
,
Vec3
enclosingBox
[
2
]
)
const
{
enclosingBox
[
0
][
0
]
=
enclosingBox
[
1
][
0
]
=
positions
[
0
][
0
];
enclosingBox
[
0
][
1
]
=
enclosingBox
[
1
][
1
]
=
positions
[
0
][
1
];
enclosingBox
[
0
][
2
]
=
enclosingBox
[
1
][
2
]
=
positions
[
0
][
2
];
for
(
unsigned
int
ii
=
1
;
ii
<
positions
.
size
();
ii
++
){
if
(
enclosingBox
[
0
][
0
]
>
positions
[
ii
][
0
]
){
enclosingBox
[
0
][
0
]
=
positions
[
ii
][
0
];
}
if
(
enclosingBox
[
1
][
0
]
<
positions
[
ii
][
0
]
){
enclosingBox
[
1
][
0
]
=
positions
[
ii
][
0
];
}
if
(
enclosingBox
[
0
][
1
]
>
positions
[
ii
][
1
]
){
enclosingBox
[
0
][
1
]
=
positions
[
ii
][
1
];
}
if
(
enclosingBox
[
1
][
1
]
<
positions
[
ii
][
1
]
){
enclosingBox
[
1
][
1
]
=
positions
[
ii
][
1
];
}
if
(
enclosingBox
[
0
][
2
]
>
positions
[
ii
][
2
]
){
enclosingBox
[
0
][
2
]
=
positions
[
ii
][
2
];
}
if
(
enclosingBox
[
1
][
2
]
<
positions
[
ii
][
2
]
){
enclosingBox
[
1
][
2
]
=
positions
[
ii
][
2
];
}
}
return
;
}
/**
* Predicate for sorting <int,double> pair
*
* @param d1 first IntDoublePair to compare
* @param d2 second IntDoublePair to compare
*
*/
bool
TestIntDoublePair
(
const
IntDoublePair
&
d1
,
const
IntDoublePair
&
d2
){
return
d1
.
second
<
d2
.
second
;
}
/**
* Get sorted distances from particular position
*
* @param periodicBoundaryConditions if set, apply PBC
* @param positionIndex input position index
* @param positions input vector of positions
* @param sortVector on output sorted IntDoublePairVector
*
*/
void
PositionGenerator
::
getSortedDistances
(
int
periodicBoundaryConditions
,
int
positionIndex
,
const
std
::
vector
<
Vec3
>&
positions
,
IntDoublePairVector
&
sortVector
)
const
{
sortVector
.
resize
(
0
);
for
(
unsigned
int
ii
=
0
;
ii
<
positions
.
size
();
ii
++
){
if
(
ii
==
positionIndex
)
continue
;
double
distance
=
periodicBoundaryConditions
?
getPeriodicDistance
(
positionIndex
,
ii
,
positions
)
:
getDistance
(
positionIndex
,
ii
,
positions
);
sortVector
.
push_back
(
IntDoublePair
(
ii
,
sqrt
(
distance
)
)
);
}
std
::
sort
(
sortVector
.
begin
(),
sortVector
.
end
(),
TestIntDoublePair
);
return
;
}
/**---------------------------------------------------------------------------------------
*
* Set string field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setStringFromMap
(
MapStringString
&
argumentMap
,
std
::
string
fieldToCheck
,
std
::
string
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
//static const std::string methodName = "setStringFromMap";
// ---------------------------------------------------------------------------------------
MapStringStringCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
(
*
check
).
second
;
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
*
* Set int field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setIntFromMap
(
MapStringString
&
argumentMap
,
std
::
string
fieldToCheck
,
int
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
//static const std::string methodName = "setIntFromMap";
// ---------------------------------------------------------------------------------------
MapStringStringCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
atoi
(
(
*
check
).
second
.
c_str
()
);
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
*
* Set int field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setIntFromMapStringToDouble
(
MapStringToDouble
&
argumentMap
,
std
::
string
fieldToCheck
,
int
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
MapStringToDoubleCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
static_cast
<
int
>
(
check
->
second
+
0.0000001
);
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
* Set float field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setFloatFromMap
(
MapStringString
&
argumentMap
,
std
::
string
fieldToCheck
,
float
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
static
const
std
::
string
methodName
=
"setFloatFromMap"
;
// ---------------------------------------------------------------------------------------
MapStringStringCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
static_cast
<
float
>
(
atof
(
(
*
check
).
second
.
c_str
()
));
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
*
* Set double field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setDoubleFromMap
(
MapStringString
&
argumentMap
,
std
::
string
fieldToCheck
,
double
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
MapStringStringCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
atof
(
(
*
check
).
second
.
c_str
()
);
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
*
* Set double field if in map
*
* @param argumentMap map to check
* @param fieldToCheck key
* @param fieldToSet field to set
*
* @return 1 if argument set, else 0
*
--------------------------------------------------------------------------------------- */
static
int
setDoubleFromMapStringToDouble
(
MapStringToDouble
&
argumentMap
,
std
::
string
fieldToCheck
,
double
&
fieldToSet
){
// ---------------------------------------------------------------------------------------
MapStringToDoubleCI
check
=
argumentMap
.
find
(
fieldToCheck
);
if
(
check
!=
argumentMap
.
end
()
){
fieldToSet
=
check
->
second
;
return
1
;
}
return
0
;
}
/**---------------------------------------------------------------------------------------
*
* Compare forces from two states
*
* @param state1 state1
* @param state2 state2
* @param relativeTolerance relative tolerance
* @param log if set, output forces
*
* @return number of entries with relative difference > tolerance
*
--------------------------------------------------------------------------------------- */
int
compareForcesOfTwoStates
(
State
&
state1
,
State
&
state2
,
double
relativeTolerance
,
DoubleVector
&
stats
,
FILE
*
log
)
{
int
error
=
0
;
vector
<
Vec3
>
force1
=
state1
.
getForces
();
vector
<
Vec3
>
force2
=
state2
.
getForces
();
double
maxRelativeDifference
=
-
1.0e+30
;
double
maxRelativeDifferenceIndex
=
-
1.0
;
double
averageRelativeDifference
=
0.0
;
double
count
=
0.0
;
DoubleVector
medians1
(
force1
.
size
()
);
DoubleVector
medians2
(
force1
.
size
()
);
for
(
unsigned
int
ii
=
0
;
ii
<
force1
.
size
();
ii
++
){
Vec3
f1
=
force1
[
ii
];
Vec3
f2
=
force2
[
ii
];
double
diff
=
(
f1
[
0
]
-
f2
[
0
])
*
(
f1
[
0
]
-
f2
[
0
])
+
(
f1
[
1
]
-
f2
[
1
])
*
(
f1
[
1
]
-
f2
[
1
])
+
(
f1
[
2
]
-
f2
[
2
])
*
(
f1
[
2
]
-
f2
[
2
]);
double
denom1
=
sqrt
(
f1
[
0
]
*
f1
[
0
]
+
f1
[
1
]
*
f1
[
1
]
+
f1
[
2
]
*
f1
[
2
]
);
double
denom2
=
sqrt
(
f2
[
0
]
*
f2
[
0
]
+
f2
[
1
]
*
f2
[
1
]
+
f2
[
2
]
*
f2
[
2
]
);
medians1
[
ii
]
=
denom1
;
medians2
[
ii
]
=
denom2
;
double
relativeDiff
;
if
(
denom1
>
0.0
||
denom2
>
0.0
){
relativeDiff
=
2.0
*
sqrt
(
diff
)
/
(
denom1
+
denom2
);
}
else
{
relativeDiff
=
0.0
;
}
if
(
relativeDiff
>
maxRelativeDifference
){
maxRelativeDifference
=
relativeDiff
;
maxRelativeDifferenceIndex
=
static_cast
<
double
>
(
ii
);
}
averageRelativeDifference
+=
relativeDiff
;
count
+=
1.0
;
if
(
relativeDiff
>
relativeTolerance
){
error
++
;
}
if
(
log
){
(
void
)
fprintf
(
log
,
"F %6u %15.7e [%15.7e %15.7e %15.7e] [%15.7e %15.7e %15.7e] %15.7e %15.7e %s
\n
"
,
static_cast
<
unsigned
int
>
(
ii
),
relativeDiff
,
f1
[
0
],
f1
[
1
],
f1
[
2
],
f2
[
0
],
f2
[
1
],
f2
[
2
],
denom1
,
denom2
,
(
relativeDiff
<
relativeTolerance
?
""
:
"XXXXXX"
)
);
}
}
if
(
count
>
0.0
){
averageRelativeDifference
/=
count
;
}
std
::
sort
(
medians1
.
begin
(),
medians1
.
end
()
);
std
::
sort
(
medians2
.
begin
(),
medians2
.
end
()
);
double
median1
=
medians1
[
medians1
.
size
()
/
2
];
double
median2
=
medians2
[
medians2
.
size
()
/
2
];
stats
.
resize
(
4
);
stats
[
0
]
=
averageRelativeDifference
;
stats
[
1
]
=
maxRelativeDifference
;
stats
[
2
]
=
maxRelativeDifferenceIndex
;
stats
[
3
]
=
median1
<
median2
?
median1
:
median2
;
return
error
;
}
/**
* Get forces in system
*
* @param system system to serialize
* @param stringForceVector output stringForceVector[forceName] = force index
* @param log logging file (optional -- may be NULL)
*
*/
static
void
getStringForceMap
(
System
&
system
,
MapStringInt
&
stringForceVector
,
FILE
*
log
){
// print active forces and relevant parameters
for
(
int
ii
=
0
;
ii
<
system
.
getNumForces
();
ii
++
)
{
int
hit
=
0
;
Force
&
force
=
system
.
getForce
(
ii
);
if
(
!
hit
){
try
{
CMAPTorsionForce
&
castForce
=
dynamic_cast
<
CMAPTorsionForce
&>
(
force
);
stringForceVector
[
"CMAPTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomAngleForce
&
castForce
=
dynamic_cast
<
CustomAngleForce
&>
(
force
);
stringForceVector
[
"CustomAngle"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomBondForce
&
castForce
=
dynamic_cast
<
CustomBondForce
&>
(
force
);
stringForceVector
[
"CustomBond"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomExternalForce
&
castForce
=
dynamic_cast
<
CustomExternalForce
&>
(
force
);
stringForceVector
[
"CustomExternal"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomGBForce
&
castForce
=
dynamic_cast
<
CustomGBForce
&>
(
force
);
stringForceVector
[
"CustomGB"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomHbondForce
&
castForce
=
dynamic_cast
<
CustomHbondForce
&>
(
force
);
stringForceVector
[
"CustomHbond"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomNonbondedForce
&
castForce
=
dynamic_cast
<
CustomNonbondedForce
&>
(
force
);
stringForceVector
[
"CustomNonbonded"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
CustomTorsionForce
&
castForce
=
dynamic_cast
<
CustomTorsionForce
&>
(
force
);
stringForceVector
[
"CustomTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
GBSAOBCForce
&
castForce
=
dynamic_cast
<
GBSAOBCForce
&>
(
force
);
stringForceVector
[
"GBSAOBC"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
GBVIForce
&
castForce
=
dynamic_cast
<
GBVIForce
&>
(
force
);
stringForceVector
[
"GBVI"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
HarmonicAngleForce
&
castForce
=
dynamic_cast
<
HarmonicAngleForce
&>
(
force
);
stringForceVector
[
"HarmonicAngle"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
HarmonicBondForce
&
castForce
=
dynamic_cast
<
HarmonicBondForce
&>
(
force
);
stringForceVector
[
"HarmonicBond"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
NonbondedForce
&
castForce
=
dynamic_cast
<
NonbondedForce
&>
(
force
);
stringForceVector
[
"Nonbonded"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
PeriodicTorsionForce
&
castForce
=
dynamic_cast
<
PeriodicTorsionForce
&>
(
force
);
stringForceVector
[
"PeriodicTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
RBTorsionForce
&
castForce
=
dynamic_cast
<
RBTorsionForce
&>
(
force
);
stringForceVector
[
"RBTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
MonteCarloBarostat
&
castForce
=
dynamic_cast
<
MonteCarloBarostat
&>
(
force
);
stringForceVector
[
"MonteCarloBarostat"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AndersenThermostat
&
castForce
=
dynamic_cast
<
AndersenThermostat
&>
(
force
);
stringForceVector
[
"AndersenThermostat"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
#ifdef USE_SOFTCORE
if
(
!
hit
){
try
{
GBSAOBCSoftcoreForce
&
castForce
=
dynamic_cast
<
GBSAOBCSoftcoreForce
&>
(
force
);
stringForceVector
[
"GBSAOBCSoftcore"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
GBVISoftcoreForce
&
castForce
=
dynamic_cast
<
GBVISoftcoreForce
&>
(
force
);
stringForceVector
[
"GBVISoftcore"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
NonbondedSoftcoreForce
&
castForce
=
dynamic_cast
<
NonbondedSoftcoreForce
&>
(
force
);
stringForceVector
[
"NonbondedSoftcore"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
#endif
#ifdef INCLUDE_AMOEBA_FORCES
if
(
!
hit
){
try
{
AmoebaHarmonicBondForce
&
castForce
=
dynamic_cast
<
AmoebaHarmonicBondForce
&>
(
force
);
stringForceVector
[
"AmoebaHarmonicBond"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaHarmonicAngleForce
&
castForce
=
dynamic_cast
<
AmoebaHarmonicAngleForce
&>
(
force
);
stringForceVector
[
"AmoebaHarmonicAngle"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaHarmonicInPlaneAngleForce
&
castForce
=
dynamic_cast
<
AmoebaHarmonicInPlaneAngleForce
&>
(
force
);
stringForceVector
[
"AmoebaHarmonicInPlaneAngle"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaMultipoleForce
&
castForce
=
dynamic_cast
<
AmoebaMultipoleForce
&>
(
force
);
stringForceVector
[
"AmoebaMultipole"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaOutOfPlaneBendForce
&
castForce
=
dynamic_cast
<
AmoebaOutOfPlaneBendForce
&>
(
force
);
stringForceVector
[
"AmoebaOutOfPlaneBend"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaPiTorsionForce
&
castForce
=
dynamic_cast
<
AmoebaPiTorsionForce
&>
(
force
);
stringForceVector
[
"AmoebaPiTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaStretchBendForce
&
castForce
=
dynamic_cast
<
AmoebaStretchBendForce
&>
(
force
);
stringForceVector
[
"AmoebaStretchBend"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaTorsionForce
&
castForce
=
dynamic_cast
<
AmoebaTorsionForce
&>
(
force
);
stringForceVector
[
"AmoebaTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaTorsionTorsionForce
&
castForce
=
dynamic_cast
<
AmoebaTorsionTorsionForce
&>
(
force
);
stringForceVector
[
"AmoebaTorsionTorsion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaUreyBradleyForce
&
castForce
=
dynamic_cast
<
AmoebaUreyBradleyForce
&>
(
force
);
stringForceVector
[
"AmoebaUreyBradley"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaVdwForce
&
castForce
=
dynamic_cast
<
AmoebaVdwForce
&>
(
force
);
stringForceVector
[
"AmoebaVdw"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaWcaDispersionForce
&
castForce
=
dynamic_cast
<
AmoebaWcaDispersionForce
&>
(
force
);
stringForceVector
[
"AmoebaWcaDispersion"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaGeneralizedKirkwoodForce
&
castForce
=
dynamic_cast
<
AmoebaGeneralizedKirkwoodForce
&>
(
force
);
stringForceVector
[
"AmoebaGeneralizedKirkwood"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
){
try
{
AmoebaTorsionTorsionForce
&
castForce
=
dynamic_cast
<
AmoebaTorsionTorsionForce
&>
(
force
);
stringForceVector
[
"AmoebaTorsionTorsionForce"
]
=
ii
;
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
#endif
// COM
if
(
!
hit
){
try
{
CMMotionRemover
&
cMMotionRemover
=
dynamic_cast
<
CMMotionRemover
&>
(
force
);
hit
++
;
}
catch
(
std
::
bad_cast
){
}
}
if
(
!
hit
&&
log
){
(
void
)
fprintf
(
log
,
" entry=%2d force not recognized.
\n
"
,
ii
);
}
}
}
/**---------------------------------------------------------------------------------------
*
* Copy NonbondedSoftcoreForce
*
* @param nonbondedSoftcoreForce NonbondedSoftcoreForce to copy
*
* @return copy of nonbondedSoftcoreForce
*
--------------------------------------------------------------------------------------- */
static
NonbondedSoftcoreForce
*
copyNonbondedSoftcoreForce
(
const
NonbondedSoftcoreForce
&
nonbondedSoftcoreForce
){
NonbondedSoftcoreForce
*
copyNonbondedSoftcoreForce
=
new
NonbondedSoftcoreForce
(
nonbondedSoftcoreForce
);
/*
copyNonbondedSoftcoreForce->setNonbondedMethod( nonbondedSoftcoreForce.getNonbondedMethod() );
copyNonbondedSoftcoreForce->setCutoffDistance( nonbondedSoftcoreForce.getCutoffDistance() );
copyNonbondedSoftcoreForce->setReactionFieldDielectric( nonbondedSoftcoreForce.getReactionFieldDielectric() );
// particle parameters
for( unsigned int ii = 0; ii < nonbondedSoftcoreForce.getNumParticles(); ii++ ){
double charge;
double sigma;
double epsilon;
double softcoreLJLambda;
nonbondedSoftcoreForce.getParticleParameters(ii, charge, sigma, epsilon, softcoreLJLambda);
copyNonbondedSoftcoreForce->addParticle( charge, sigma, epsilon, softcoreLJLambda);
}
// exceptions
for( unsigned int ii = 0; ii < nonbondedSoftcoreForce.getNumExceptions(); ii++ ){
int particle1, particle2;
double chargeProd;
double sigma;
double epsilon;
double softcoreLJLambda;
nonbondedSoftcoreForce.getExceptionParameters( ii, particle1, particle2, chargeProd, sigma, epsilon, softcoreLJLambda );
copyNonbondedSoftcoreForce->addException( particle1, particle2, chargeProd, sigma, epsilon, softcoreLJLambda );
}
*/
return
copyNonbondedSoftcoreForce
;
}
/**---------------------------------------------------------------------------------------
*
* Copy NonbondedForce
*
* @param nonbondedForce NonbondedForce to copy
*
* @return copy of nonbondedForce
*
--------------------------------------------------------------------------------------- */
static
NonbondedForce
*
copyNonbondedForce
(
const
NonbondedForce
&
nonbondedForce
){
NonbondedForce
*
copyNonbondedForce
=
new
NonbondedForce
(
nonbondedForce
);
/*
copyNonbondedForce->setNonbondedMethod( nonbondedForce.getNonbondedMethod() );
copyNonbondedForce->setCutoffDistance( nonbondedForce.getCutoffDistance() );
copyNonbondedForce->setReactionFieldDielectric( nonbondedForce.getReactionFieldDielectric() );
// particle parameters
for( unsigned int ii = 0; ii < nonbondedForce.getNumParticles(); ii++ ){
double charge;
double sigma;
double epsilon;
double softcoreLJLambda;
nonbondedForce.getParticleParameters(ii, charge, sigma, epsilon, softcoreLJLambda);
copyNonbondedForce->addParticle( charge, sigma, epsilon, softcoreLJLambda);
}
// exceptions
for( unsigned int ii = 0; ii < nonbondedForce.getNumExceptions(); ii++ ){
int particle1, particle2;
double chargeProd;
double sigma;
double epsilon;
double softcoreLJLambda;
nonbondedForce.getExceptionParameters( ii, particle1, particle2, chargeProd, sigma, epsilon, softcoreLJLambda );
copyNonbondedForce->addException( particle1, particle2, chargeProd, sigma, epsilon, softcoreLJLambda );
}
*/
return
copyNonbondedForce
;
}
/**
* Return copy of system (but not forces)
*
* @param inputSystem system to copy
*
* @return system copy
*
*/
static
void
copySystem
(
const
System
&
inputSystem
,
System
&
systemCopy
){
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
inputSystem
.
getNumParticles
());
ii
++
){
systemCopy
.
addParticle
(
inputSystem
.
getParticleMass
(
static_cast
<
int
>
(
ii
)
)
);
}
Vec3
a
;
Vec3
b
;
Vec3
c
;
inputSystem
.
getDefaultPeriodicBoxVectors
(
a
,
b
,
c
);
systemCopy
.
setDefaultPeriodicBoxVectors
(
a
,
b
,
c
);
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
inputSystem
.
getNumConstraints
());
ii
++
){
int
particle1
,
particle2
;
double
distance
;
inputSystem
.
getConstraintParameters
(
ii
,
particle1
,
particle2
,
distance
);
systemCopy
.
addConstraint
(
particle1
,
particle2
,
distance
);
}
return
;
}
/**
* Randomize parameters
*
* @param parametersLowerBound vector of parameter lower bounds
* @param parametersUpperBound vector of parameter upper bounds
* @param sfmt SFMT random number generator
* @param parameters output vector of randomized parameter values
*
*/
static
void
randomizeParameters
(
const
std
::
vector
<
double
>&
parametersLowerBound
,
const
std
::
vector
<
double
>&
parametersUpperBound
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
double
>&
parameters
){
if
(
parametersLowerBound
.
size
()
!=
parametersUpperBound
.
size
()
){
std
::
stringstream
msg
;
msg
<<
" randomizeParameters parametersLowerBound size="
<<
parametersLowerBound
.
size
()
<<
" != parametersUpperBound size="
<<
parametersUpperBound
.
size
();
throw
OpenMMException
(
msg
.
str
()
);
}
if
(
parametersLowerBound
.
size
()
!=
parameters
.
size
()
){
std
::
stringstream
msg
;
msg
<<
" randomizeParameters parametersLowerBound size="
<<
parametersLowerBound
.
size
()
<<
" != parameter size="
<<
parameters
.
size
();
throw
OpenMMException
(
msg
.
str
()
);
}
for
(
unsigned
int
ii
=
0
;
ii
<
parametersLowerBound
.
size
();
ii
++
){
parameters
[
ii
]
=
parametersLowerBound
[
ii
]
+
(
parametersUpperBound
[
ii
]
-
parametersLowerBound
[
ii
])
*
(
genrand_real2
(
sfmt
));
}
return
;
}
/**
* Randomize Vec3 vector
*
* @param average mean value
* @param range +/- range
* @param sfmt SFMT random number generator
* @param array output vector of randomized values
*
*/
static
void
randomizeVec3
(
double
average
,
double
range
,
OpenMM_SFMT
::
SFMT
&
sfmt
,
std
::
vector
<
Vec3
>&
array
){
range
*=
2.0
;
for
(
unsigned
int
ii
=
0
;
ii
<
array
.
size
();
ii
++
){
array
[
ii
]
=
Vec3
(
average
+
range
*
(
genrand_real2
(
sfmt
)
-
0.5
),
average
+
range
*
(
genrand_real2
(
sfmt
)
-
0.5
),
average
+
range
*
(
genrand_real2
(
sfmt
)
-
0.5
)
);
}
return
;
}
/**
* Output contents of MapStringString
*
* @param inputArgumentMap map to output
* @param outputStream output stream
*
*/
static
void
streamArgumentMap
(
const
MapStringString
&
inputArgumentMap
,
std
::
stringstream
&
outputStream
){
char
buffer
[
2048
];
for
(
MapStringStringCI
ii
=
inputArgumentMap
.
begin
();
ii
!=
inputArgumentMap
.
end
();
ii
++
){
std
::
string
key
=
ii
->
first
;
std
::
string
value
=
ii
->
second
;
(
void
)
sprintf
(
buffer
,
" %30s %40s
\n
"
,
key
.
c_str
(),
value
.
c_str
()
);
outputStream
<<
buffer
;
}
return
;
}
/**
* Format argument/value
*
* @param buffer formatted output
* @param key argument name
* @param value argument value
* @param format format string
* @param call if call > 0, skip key name
* @param type type == 0, then use int value; else double
*
*/
static
void
formatArgument
(
char
*
buffer
,
const
std
::
string
&
key
,
double
value
,
const
char
*
format
,
int
call
,
int
type
){
// if call > 0, skip key name
unsigned
int
index
=
0
;
while
(
index
<
key
.
size
()
){
buffer
[
index
]
=
call
?
' '
:
key
[
index
];
index
++
;
}
// add blank
buffer
[
index
++
]
=
' '
;
buffer
[
index
]
=
static_cast
<
char
>
(
NULL
);
if
(
type
==
0
){
int
valueInt
=
static_cast
<
int
>
(
value
+
0.00001
);
(
void
)
sprintf
(
buffer
+
index
,
format
,
valueInt
);
}
else
{
(
void
)
sprintf
(
buffer
+
index
,
format
,
value
);
}
return
;
}
/**
* Output contents of MapStringString w/ all argument on one line
*
* @param inputArgumentMap map to output
* @param exclude map of keys to exclude from output
* @param outputStream output stream
*
*/
static
void
streamArgumentMapOneLine
(
const
MapStringToDouble
&
inputArgumentMap
,
const
MapStringToInt
&
exclude
,
const
StringVector
&
printFirst
,
int
callId
,
std
::
stringstream
&
outputStream
){
char
buffer
[
2048
];
MapStringToInt
excludeAll
(
exclude
);
for
(
unsigned
int
ii
=
0
;
ii
<
printFirst
.
size
();
ii
++
){
MapStringToDoubleCI
iter
=
inputArgumentMap
.
find
(
printFirst
[
ii
]
);
if
(
iter
!=
inputArgumentMap
.
end
()
){
std
::
string
key
=
iter
->
first
;
if
(
exclude
.
find
(
key
)
==
exclude
.
end
()
){
double
value
=
iter
->
second
;
if
(
key
==
"numMolecules"
){
formatArgument
(
buffer
,
key
,
value
,
"%6d "
,
callId
,
0
);
}
else
if
(
key
==
"nonbondedMethod"
){
formatArgument
(
buffer
,
key
,
value
,
"%1d "
,
callId
,
0
);
}
else
if
(
key
==
"lambda1"
||
key
==
"lambda2"
){
formatArgument
(
buffer
,
key
,
value
,
"%4.2f "
,
callId
,
1
);
}
else
if
(
key
==
"boxSize"
){
formatArgument
(
buffer
,
key
,
value
,
"%6.2f "
,
callId
,
1
);
}
else
{
formatArgument
(
buffer
,
key
,
value
,
"%15.7e "
,
callId
,
1
);
}
outputStream
<<
buffer
;
excludeAll
[
key
]
=
1
;
}
}
}
for
(
MapStringToDoubleCI
ii
=
inputArgumentMap
.
begin
();
ii
!=
inputArgumentMap
.
end
();
ii
++
){
std
::
string
key
=
ii
->
first
;
if
(
excludeAll
.
find
(
key
)
==
excludeAll
.
end
()
){
double
value
=
ii
->
second
;
int
valueInt
=
static_cast
<
int
>
(
value
+
0.00001
);
double
valueDouble
=
static_cast
<
double
>
(
valueInt
);
if
(
key
==
"numMolecules"
){
(
void
)
sprintf
(
buffer
,
"%s=%6d "
,
key
.
c_str
(),
valueInt
);
}
else
if
(
key
==
"nonbondedMethod"
){
(
void
)
sprintf
(
buffer
,
"%s=%1d "
,
key
.
c_str
(),
valueInt
);
}
else
if
(
key
==
"lambda1"
||
key
==
"lambda2"
){
(
void
)
sprintf
(
buffer
,
"%s=%4.2f "
,
key
.
c_str
(),
value
);
}
else
if
(
key
==
"boxSize"
){
(
void
)
sprintf
(
buffer
,
"%s=%6.2f "
,
key
.
c_str
(),
value
);
}
else
if
(
valueDouble
==
value
){
(
void
)
sprintf
(
buffer
,
"%s=%6d "
,
key
.
c_str
(),
valueInt
);
}
else
{
(
void
)
sprintf
(
buffer
,
"%s=%15.7e "
,
key
.
c_str
(),
value
);
}
outputStream
<<
buffer
;
}
}
outputStream
<<
std
::
endl
;
return
;
}
/**
* Get signature of a MapStringToDouble object
*
* @param inputArgumentMap map
* @return signature
*
*/
static
double
getMapStringToDoubleSignature
(
const
MapStringToDouble
&
inputArgumentMap
){
double
signature
=
0.0
;
double
offset
=
0.1
;
for
(
MapStringToDoubleCI
ii
=
inputArgumentMap
.
begin
();
ii
!=
inputArgumentMap
.
end
();
ii
++
){
signature
+=
(
offset
+
ii
->
second
);
offset
+=
0.1
;
}
return
signature
;
}
/**
* Compare two MapStringToDouble to see if they have the same (key,value) pairs
*
* @param inputArgumentMap1 map 1
* @param inputArgumentMap2 map 2
*
* @return true if maps have same (key,value) pairs; otherwise false
*
*/
static
bool
compareMapStringToDoubles
(
const
MapStringToDouble
&
inputArgumentMap1
,
const
MapStringToDouble
&
inputArgumentMap2
){
if
(
inputArgumentMap1
.
size
()
!=
inputArgumentMap1
.
size
()
){
return
false
;
}
for
(
MapStringToDoubleCI
ii
=
inputArgumentMap1
.
begin
();
ii
!=
inputArgumentMap1
.
end
();
ii
++
){
MapStringToDoubleCI
jj
=
inputArgumentMap2
.
find
(
(
*
ii
).
first
);
if
(
jj
==
inputArgumentMap2
.
end
()
||
jj
->
second
!=
ii
->
second
){
return
false
;
}
}
return
true
;
}
/**
* Generate collection of inputArguments maps given
* list of DoubleVectors for each argument
*
* @param inputArguments map[argumentKey] = vector of double parameter values
* @param argumentMaps output vector of generated maps
*
*/
static
void
generateInputArgumentMapsFromStringVectors
(
const
MapStringToDoubleVector
&
inputArguments
,
VectorOfMapStringToDouble
&
argumentMaps
){
for
(
MapStringToDoubleVectorCI
ii
=
inputArguments
.
begin
();
ii
!=
inputArguments
.
end
();
ii
++
){
std
::
string
argumentName
=
(
*
ii
).
first
;
DoubleVector
arguments
=
(
*
ii
).
second
;
unsigned
int
initialArgumentMapSize
=
argumentMaps
.
size
();
// generate signature map for each argument map
MapDoubleToInt
signatures
;
for
(
unsigned
int
kk
=
0
;
kk
<
initialArgumentMapSize
;
kk
++
){
double
signature
=
getMapStringToDoubleSignature
(
argumentMaps
[
kk
]
);
signatures
[
signature
]
=
1
;
}
// for each current argumment map, add a new argument map w/ (key,value)
// check that no existing map has the same arguments before adding to the
// vector of argument maps
for
(
unsigned
int
kk
=
0
;
kk
<
initialArgumentMapSize
;
kk
++
){
for
(
unsigned
int
jj
=
0
;
jj
<
arguments
.
size
();
jj
++
){
MapStringToDouble
inputArgumentMap
=
MapStringToDouble
(
argumentMaps
[
kk
]);
inputArgumentMap
[
argumentName
]
=
arguments
[
jj
];
double
signature
=
getMapStringToDoubleSignature
(
inputArgumentMap
);
if
(
signatures
.
find
(
signature
)
==
signatures
.
end
()
){
argumentMaps
.
push_back
(
inputArgumentMap
);
}
else
{
bool
match
=
0
;
for
(
unsigned
int
mm
=
0
;
mm
<
initialArgumentMapSize
&&
!
match
;
mm
++
){
match
=
compareMapStringToDoubles
(
inputArgumentMap
,
argumentMaps
[
mm
]
);
}
if
(
!
match
){
argumentMaps
.
push_back
(
inputArgumentMap
);
}
}
}
}
}
return
;
}
/**
* Predicate for sorting map[string] = double
*
* @param d1 first MapStringToDouble to compare
* @param d2 second MapStringToDouble to compare
*
*/
bool
TestMapSortPredicate
(
const
MapStringToDouble
&
d1
,
const
MapStringToDouble
&
d2
){
StringVector
sortOrder
;
sortOrder
.
push_back
(
"numMolecules"
);
sortOrder
.
push_back
(
"nonbondedMethod"
);
sortOrder
.
push_back
(
"lambda2"
);
sortOrder
.
push_back
(
"boxSize"
);
for
(
unsigned
int
ii
=
0
;
ii
<
sortOrder
.
size
();
ii
++
){
if
(
d1
.
find
(
sortOrder
[
ii
]
)
!=
d1
.
end
()
&&
d2
.
find
(
sortOrder
[
ii
]
)
!=
d2
.
end
()
){
MapStringToDoubleCI
d1i
=
d1
.
find
(
sortOrder
[
ii
]
);
MapStringToDoubleCI
d2i
=
d2
.
find
(
sortOrder
[
ii
]
);
if
(
d1i
->
second
!=
d2i
->
second
){
return
d1i
->
second
<
d2i
->
second
;
}
}
}
return
false
;
}
static
CustomNonbondedForce
*
buildCustomNonbondedSoftcoreForce
(
const
NonbondedSoftcoreForce
&
nonbondedSoftcoreForce
){
CustomNonbondedForce
*
customNonbonded
;
if
(
nonbondedSoftcoreForce
.
getNonbondedMethod
()
==
NoCutoff
){
customNonbonded
=
new
CustomNonbondedForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q/r;"
"q=q1*q2;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda);"
"sigma=0.5*(sigma1+sigma2);"
"eps=sqrt(eps1*eps2);"
"lambda=min(lambda1,lambda2)"
);
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
NoCutoff
);
}
else
{
customNonbonded
=
new
CustomNonbondedForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q*(1.0/r+(krf*r*r)-crf);"
"q=q1*q2;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda);"
"sigma=0.5*(sigma1+sigma2);"
"eps=sqrt(eps1*eps2);"
"lambda=min(lambda1,lambda2)"
);
customNonbonded
->
setCutoffDistance
(
nonbondedSoftcoreForce
.
getCutoffDistance
()
);
if
(
nonbondedSoftcoreForce
.
getNonbondedMethod
()
==
CutoffNonPeriodic
){
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
CutoffNonPeriodic
);
}
else
{
customNonbonded
->
setNonbondedMethod
(
CustomNonbondedForce
::
CutoffPeriodic
);
}
double
cutoffDistance
=
nonbondedSoftcoreForce
.
getCutoffDistance
();
double
reactionFieldDielectric
=
nonbondedSoftcoreForce
.
getReactionFieldDielectric
();
double
eps2
=
(
reactionFieldDielectric
-
1.0
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
double
kValue
=
eps2
/
(
cutoffDistance
*
cutoffDistance
*
cutoffDistance
);
customNonbonded
->
addGlobalParameter
(
"krf"
,
kValue
);
double
cValue
=
(
1.0
/
cutoffDistance
)
*
(
3.0
*
reactionFieldDielectric
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
customNonbonded
->
addGlobalParameter
(
"crf"
,
cValue
);
}
customNonbonded
->
addPerParticleParameter
(
"q"
);
customNonbonded
->
addPerParticleParameter
(
"sigma"
);
customNonbonded
->
addPerParticleParameter
(
"eps"
);
customNonbonded
->
addPerParticleParameter
(
"lambda"
);
vector
<
double
>
nonbondedParams
(
4
);
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
nonbondedSoftcoreForce
.
getNumParticles
());
ii
++
){
double
charge
;
double
sigma
;
double
epsilon
;
double
softcoreLJLambda
;
nonbondedSoftcoreForce
.
getParticleParameters
(
ii
,
charge
,
sigma
,
epsilon
,
softcoreLJLambda
);
nonbondedParams
[
0
]
=
charge
;
nonbondedParams
[
1
]
=
sigma
;
nonbondedParams
[
2
]
=
epsilon
;
nonbondedParams
[
3
]
=
softcoreLJLambda
;
customNonbonded
->
addParticle
(
nonbondedParams
);
}
return
customNonbonded
;
}
CustomBondForce
*
buildCustomBondForceForNonbondedExceptions
(
const
NonbondedSoftcoreForce
&
nonbondedSoftcoreForce
){
CustomBondForce
*
customBond
;
if
(
nonbondedSoftcoreForce
.
getNonbondedMethod
()
==
NoCutoff
){
customBond
=
new
CustomBondForce
(
"lambda*4*eps*(dem^2-dem)+138.935456*q/r;"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda)"
);
}
else
{
customBond
=
new
CustomBondForce
(
"withinCutoff*(lambda*4*eps*(dem^2-dem)+138.935456*q*(1.0/r+(krf*r*r)-crf));"
"withinCutoff=step(cutoff-r);"
"dem=1.0/(soft+rsig);"
"rsig=(r/sigma)^6;"
"soft=0.5*(1.0-lambda)"
);
double
cutoffDistance
=
nonbondedSoftcoreForce
.
getCutoffDistance
();
double
reactionFieldDielectric
=
nonbondedSoftcoreForce
.
getReactionFieldDielectric
();
double
eps2
=
(
reactionFieldDielectric
-
1.0
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
double
kValue
=
eps2
/
(
cutoffDistance
*
cutoffDistance
*
cutoffDistance
);
customBond
->
addGlobalParameter
(
"krf"
,
kValue
);
double
cValue
=
(
1.0
/
cutoffDistance
)
*
(
3.0
*
reactionFieldDielectric
)
/
(
2.0
*
reactionFieldDielectric
+
1.0
);
customBond
->
addGlobalParameter
(
"crf"
,
cValue
);
customBond
->
addGlobalParameter
(
"cutoff"
,
cutoffDistance
);
}
customBond
->
addPerBondParameter
(
"q"
);
customBond
->
addPerBondParameter
(
"sigma"
);
customBond
->
addPerBondParameter
(
"eps"
);
customBond
->
addPerBondParameter
(
"lambda"
);
for
(
unsigned
int
ii
=
0
;
ii
<
static_cast
<
unsigned
int
>
(
nonbondedSoftcoreForce
.
getNumExceptions
());
ii
++
){
int
particle1
,
particle2
;
double
chargeProd
;
double
sigma
;
double
epsilon
;
double
softcoreLJLambda
;
nonbondedSoftcoreForce
.
getExceptionParameters
(
ii
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
,
softcoreLJLambda
);
vector
<
double
>
bondParams
(
4
);
bondParams
[
0
]
=
chargeProd
;
bondParams
[
1
]
=
sigma
;
bondParams
[
2
]
=
epsilon
;
bondParams
[
3
]
=
softcoreLJLambda
;
customBond
->
addBond
(
particle1
,
particle2
,
bondParams
);
}
return
customBond
;
}
/**
* Perform comparison of energies/forces for two systems
*
* @param system1 first system
* @param system2 second system
* @param platform1 first platform name (Reference, Cuda, OpenCL)
* @param platform2 second platform name (Reference, Cuda, OpenCL)
* @param positions positions
* @param inputArgumentMap arguments/flags (relativeTolerance, applyAssert, ...)
* @param idString id string
* @param log logging file (optional -- may be NULL)
*
*/
void
runSystemComparisonTest
(
System
&
system1
,
System
&
system2
,
const
std
::
string
&
platform1
,
const
std
::
string
&
platform2
,
const
std
::
vector
<
Vec3
>&
positions
,
MapStringToDouble
&
inputArgumentMap
,
const
std
::
string
&
idString
,
FILE
*
log
){
int
applyAssert
=
0
;
double
relativeTolerance
=
1.0e-04
;
setDoubleFromMapStringToDouble
(
inputArgumentMap
,
"relativeTolerance"
,
relativeTolerance
);
setIntFromMapStringToDouble
(
inputArgumentMap
,
"applyAssert"
,
applyAssert
)
;
VerletIntegrator
integrator1
(
0.01
);
VerletIntegrator
integrator2
(
0.01
);
if
(
log
){
(
void
)
fprintf
(
log
,
"System1: particles=%d forces=%d System2: particles=%d forces=%d
\n
"
,
system1
.
getNumParticles
(),
system1
.
getNumForces
(),
system2
.
getNumParticles
(),
system2
.
getNumForces
()
);
(
void
)
fprintf
(
log
,
"Positions=%u
\n
"
,
static_cast
<
unsigned
int
>
(
positions
.
size
())
);
(
void
)
fprintf
(
log
,
"Platform1=%s Platform2=%s
\n
"
,
platform1
.
c_str
(),
platform2
.
c_str
()
);
(
void
)
fprintf
(
log
,
"relativeTolerance=%8.2e applyAssert=%d
\n
"
,
relativeTolerance
,
applyAssert
);
MapStringInt
stringForceVector1
;
MapStringInt
stringForceVector2
;
getStringForceMap
(
system1
,
stringForceVector1
,
log
);
(
void
)
fprintf
(
log
,
"Forces in system 1: ["
);
for
(
MapStringIntCI
ii
=
stringForceVector1
.
begin
();
ii
!=
stringForceVector1
.
end
();
ii
++
){
(
void
)
fprintf
(
log
,
" %s "
,
ii
->
first
.
c_str
()
);
}
getStringForceMap
(
system2
,
stringForceVector2
,
log
);
(
void
)
fprintf
(
log
,
"]
\n
Forces in system 2: ["
);
for
(
MapStringIntCI
ii
=
stringForceVector2
.
begin
();
ii
!=
stringForceVector2
.
end
();
ii
++
){
(
void
)
fprintf
(
log
,
" %s "
,
ii
->
first
.
c_str
()
);
}
(
void
)
fprintf
(
log
,
"]
\n
"
);
}
if
(
system1
.
getNumParticles
()
!=
system2
.
getNumParticles
()
){
std
::
stringstream
msg
;
msg
<<
"Number of particles for systems to be compared are unequal: "
<<
system1
.
getNumParticles
()
<<
" != "
<<
system2
.
getNumParticles
();
throw
OpenMMException
(
msg
.
str
()
);
}
if
(
system1
.
getNumParticles
()
!=
static_cast
<
int
>
(
positions
.
size
())
){
std
::
stringstream
msg
;
msg
<<
"Number of particles for system does not equal size of position array: "
<<
system1
.
getNumParticles
()
<<
" != "
<<
positions
.
size
();
throw
OpenMMException
(
msg
.
str
()
);
}
Context
context1
(
system1
,
integrator1
,
Platform
::
getPlatformByName
(
platform1
));
context1
.
setPositions
(
positions
);
State
state1
=
context1
.
getState
(
State
::
Forces
|
State
::
Energy
);
Context
context2
(
system2
,
integrator2
,
Platform
::
getPlatformByName
(
platform2
));
context2
.
setPositions
(
positions
);
State
state2
=
context2
.
getState
(
State
::
Forces
|
State
::
Energy
);
double
energyDiff
=
0.0
;
if
(
fabs
(
state1
.
getPotentialEnergy
()
)
>
0.0
||
fabs
(
state2
.
getPotentialEnergy
())
>
0.0
){
energyDiff
=
fabs
(
state1
.
getPotentialEnergy
()
-
state2
.
getPotentialEnergy
()
)
/
(
fabs
(
state1
.
getPotentialEnergy
()
)
+
fabs
(
state2
.
getPotentialEnergy
()
)
);
}
if
(
log
){
DoubleVector
stats
;
compareForcesOfTwoStates
(
state1
,
state2
,
relativeTolerance
,
stats
,
log
);
(
void
)
fprintf
(
log
,
"%s %6d eDff=%15.7e fMx=%15.7e fAvg=%15.7e fMed=%15.7e eCd=%15.7e eRf=%15.7e mxFIdx=%d
\n
"
,
idString
.
c_str
(),
system1
.
getNumParticles
(),
energyDiff
,
stats
[
1
],
stats
[
0
],
stats
[
3
],
state1
.
getPotentialEnergy
(),
state2
.
getPotentialEnergy
(),
static_cast
<
int
>
(
stats
[
2
]
+
0.0001
));
(
void
)
fflush
(
log
);
}
if
(
applyAssert
){
ASSERT
(
energyDiff
<
relativeTolerance
);
for
(
int
ii
=
0
;
ii
<
system1
.
getNumParticles
();
ii
++
){
Vec3
f1
=
state1
.
getForces
()[
ii
];
Vec3
f2
=
state2
.
getForces
()[
ii
];
double
f1N
=
sqrt
(
(
f1
[
0
]
*
f1
[
0
])
+
(
f1
[
1
]
*
f1
[
1
])
+
(
f1
[
2
]
*
f1
[
2
])
);
double
f2N
=
sqrt
(
(
f2
[
0
]
*
f2
[
0
])
+
(
f2
[
1
]
*
f2
[
1
])
+
(
f2
[
2
]
*
f2
[
2
])
);
double
diff
=
(
f1
[
0
]
-
f2
[
0
])
*
(
f1
[
0
]
-
f2
[
0
])
+
(
f1
[
1
]
-
f2
[
1
])
*
(
f1
[
1
]
-
f2
[
1
])
+
(
f1
[
2
]
-
f2
[
2
])
*
(
f1
[
2
]
-
f2
[
2
]);
if
(
f1N
>
0.0
||
f1N
>
0.0
){
diff
=
2.0
*
sqrt
(
diff
)
/
(
f1N
+
f2N
);
}
ASSERT
(
diff
<
relativeTolerance
);
}
}
}
/**
* Serialize system
*
* @param system system to serialize
* @param serializeFileName file name for xml output
* @param log logging file (optional -- may be NULL)
*
*/
void
serializeSystem
(
System
&
system
,
const
std
::
string
&
serializeFileName
,
FILE
*
log
){
#ifdef OPENMM_SERIALIZE
//registerAmoebaSerializationProxies();
std
::
stringstream
buffer
;
XmlSerializer
::
serialize
<
System
>
(
&
system
,
"System"
,
buffer
);
FILE
*
filePtr
=
fopen
(
serializeFileName
.
c_str
(),
"w"
);
if
(
filePtr
==
NULL
){
if
(
log
){
(
void
)
fprintf
(
log
,
"Unable to open xml file %s
\n
"
,
serializeFileName
.
c_str
()
);
return
;
}
}
(
void
)
fprintf
(
filePtr
,
"%s"
,
buffer
.
str
().
c_str
()
);
(
void
)
fclose
(
filePtr
);
if
(
log
){
(
void
)
fprintf
(
log
,
"Wrote system to xml file %s
\n
"
,
serializeFileName
.
c_str
()
);
}
#endif
return
;
}
/**
* Output vector of Vec3 to file
*
* @param positions system to serialize
* @param fileName file name for output
* @param log logging file (optional -- may be NULL)
*
*/
void
serializeVectorOfVec3
(
const
std
::
vector
<
Vec3
>&
positions
,
std
::
string
fileName
,
FILE
*
log
){
#ifdef OPENMM_SERIALIZE
FILE
*
filePtr
=
fopen
(
fileName
.
c_str
(),
"w"
);
if
(
filePtr
==
NULL
){
if
(
log
){
(
void
)
fprintf
(
log
,
"Unable to open Vec3 file %s
\n
"
,
fileName
.
c_str
()
);
return
;
}
}
(
void
)
fprintf
(
filePtr
,
"Positions %u
\n
"
,
static_cast
<
unsigned
int
>
(
positions
.
size
())
);
for
(
unsigned
int
ii
=
0
;
ii
<
positions
.
size
();
ii
++
){
(
void
)
fprintf
(
filePtr
,
"%9u %17.10e %17.10e %17.10e
\n
"
,
ii
,
positions
[
ii
][
0
],
positions
[
ii
][
1
],
positions
[
ii
][
2
]
);
}
(
void
)
fclose
(
filePtr
);
if
(
log
){
(
void
)
fprintf
(
log
,
"Wrote to file %s
\n
"
,
fileName
.
c_str
()
);
}
#endif
return
;
}
/**
* Serialize system and positions
*
* @param system system to serialize
* @param positions positions to output
* @param baseFileName base file name for xml/txt output
* @param log logging file (optional -- may be NULL)
*
*/
void
serializeSystemAndPositions
(
System
&
system
,
const
std
::
vector
<
Vec3
>&
positions
,
const
std
::
string
&
baseFileName
,
FILE
*
log
){
std
::
stringstream
xmlfileName
;
xmlfileName
<<
baseFileName
<<
".xml"
;
serializeSystem
(
system
,
xmlfileName
.
str
(),
log
);
std
::
stringstream
posfileName
;
posfileName
<<
baseFileName
<<
".txt"
;
serializeVectorOfVec3
(
positions
,
posfileName
.
str
(),
log
);
return
;
}
#endif // TEST_CUDA_SOFTCORE_FORCE_H_
plugins/freeEnergy/serialization/CMakeLists.txt
deleted
100644 → 0
View file @
c775bd19
#---------------------------------------------------
# freeEnergy Serialization Library
#
# Creates freeEnergy serializatin library, base name=freeEnergySerialization.
# Default libraries are shared & optimized. Variants
# are created for static (_static) and debug (_d).
#
# Windows:
# freeEnergySerialization[_d].dll
# freeEnergySerialization[_d].lib
# Unix:
# libfreeEnergySerialization[_d].so
#----------------------------------------------------
# The source is organized into subdirectories, but we handle them all from
# this CMakeLists file rather than letting CMake visit them as SUBDIRS.
SET
(
OPENMM_SOURCE_SUBDIRS . ../../../serialization
)
SET
(
OPENMM_FREE_ENERGY_SOURCE_SUBDIRS .
)
# Collect up information about the version of the OpenMM library we're building
# and make it available to the code so it can be built into the binaries.
SET
(
OPENMM_FREE_ENERGY_LIBRARY_NAME OpenMMFreeEnergy
)
SET
(
OPENMM_SERIALIZATION_LIBRARY_NAME OpenMMSerialization
)
SET
(
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME FreeEnergySerialization
)
# Ensure that debug libraries have "_d" appended to their names.
# CMake gets this right on Windows automatically with this definition.
IF
(
${
CMAKE_GENERATOR
}
MATCHES
"Visual Studio"
)
SET
(
CMAKE_DEBUG_POSTFIX
"_d"
CACHE INTERNAL
""
FORCE
)
ENDIF
(
${
CMAKE_GENERATOR
}
MATCHES
"Visual Studio"
)
# But on Unix or Cygwin we have to add the suffix manually
IF
(
UNIX AND CMAKE_BUILD_TYPE MATCHES Debug
)
SET
(
OPENMM_FREE_ENERGY_LIBRARY_NAME
${
OPENMM_FREE_ENERGY_LIBRARY_NAME
}
_d
)
SET
(
OPENMM_SERIALIZATION_LIBRARY_NAME
${
OPENMM_SERIALIZATION_LIBRARY_NAME
}
_d
)
SET
(
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
_d
)
ENDIF
(
UNIX AND CMAKE_BUILD_TYPE MATCHES Debug
)
# These are all the places to search for header files which are
# to be part of the API.
SET
(
API_INCLUDE_DIRS
)
# start empty
FOREACH
(
subdir
${
OPENMM_SOURCE_SUBDIRS
}
)
# append
SET
(
API_INCLUDE_DIRS
${
API_INCLUDE_DIRS
}
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/include
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/include/internal
)
ENDFOREACH
(
subdir
)
# We'll need both *relative* path names, starting with their API_INCLUDE_DIRS,
# and absolute pathnames.
SET
(
API_REL_INCLUDE_FILES
)
# start these out empty
SET
(
API_ABS_INCLUDE_FILES
)
FOREACH
(
dir
${
API_INCLUDE_DIRS
}
)
FILE
(
GLOB fullpaths
${
dir
}
/*.h
)
# returns full pathnames
SET
(
API_ABS_INCLUDE_FILES
${
API_ABS_INCLUDE_FILES
}
${
fullpaths
}
)
FOREACH
(
pathname
${
fullpaths
}
)
GET_FILENAME_COMPONENT
(
filename
${
pathname
}
NAME
)
SET
(
API_REL_INCLUDE_FILES
${
API_REL_INCLUDE_FILES
}
${
dir
}
/
${
filename
}
)
ENDFOREACH
(
pathname
)
ENDFOREACH
(
dir
)
# collect up source files
SET
(
SOURCE_FILES
)
# empty
SET
(
SOURCE_INCLUDE_FILES
)
FOREACH
(
subdir
${
OPENMM_FREE_ENERGY_SOURCE_SUBDIRS
}
)
FILE
(
GLOB_RECURSE src_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/src/*.cpp
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/src/*.c
)
FILE
(
GLOB incl_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/src/*.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/src/*.hpp
)
SET
(
SOURCE_FILES
${
SOURCE_FILES
}
${
src_files
}
)
#append
SET
(
SOURCE_INCLUDE_FILES
${
SOURCE_INCLUDE_FILES
}
${
incl_files
}
)
INCLUDE_DIRECTORIES
(
BEFORE
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
subdir
}
/include
)
INCLUDE_DIRECTORIES
(
BEFORE
${
CMAKE_CURRENT_SOURCE_DIR
}
/../../../serialization/
${
subdir
}
/include
)
ENDFOREACH
(
subdir
)
#Message( "API_REL_INCLUDE_FILES=${API_REL_INCLUDE_FILES}\n" )
INCLUDE_DIRECTORIES
(
BEFORE
${
CMAKE_CURRENT_SOURCE_DIR
}
/src
)
# Create the library
ADD_LIBRARY
(
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
SHARED
${
SOURCE_FILES
}
${
SOURCE_INCLUDE_FILES
}
${
API_ABS_INCLUDE_FILES
}
)
TARGET_LINK_LIBRARIES
(
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
${
OPENMM_FREE_ENERGY_LIBRARY_NAME
}
${
OPENMM_SERIALIZATION_LIBRARY_NAME
}
${
SHARED_TARGET
}
)
SET_TARGET_PROPERTIES
(
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
PROPERTIES COMPILE_FLAGS
"-DOPENMM_BUILDING_SHARED_LIBRARY -DTIXML_USE_STL -DIEEE_8087"
)
INSTALL_TARGETS
(
/lib/plugins RUNTIME_DIRECTORY /lib/plugins
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
)
ADD_SUBDIRECTORY
(
tests
)
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyGBSAOBCSoftcoreForceProxy.h
deleted
100644 → 0
View file @
c775bd19
#ifndef OPENMM_FREE_ENERGY_GBSAOBC_SOFTCORE_FORCE_PROXY_H_
#define OPENMM_FREE_ENERGY_GBSAOBC_SOFTCORE_FORCE_PROXY_H_
/* -------------------------------------------------------------------------- *
* OpenMMAmoeba *
* -------------------------------------------------------------------------- *
* 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) 2010 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 PROSAOBCDED "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/internal/windowsExport.h"
#include "openmm/serialization/SerializationProxy.h"
namespace
OpenMM
{
/**
* This is a proxy for serializing GBSAOBCSoftcoreForce objects.
*/
class
OPENMM_EXPORT
GBSAOBCSoftcoreForceProxy
:
public
SerializationProxy
{
public:
GBSAOBCSoftcoreForceProxy
();
void
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
;
void
*
deserialize
(
const
SerializationNode
&
node
)
const
;
};
}
// namespace OpenMM
#endif
/*OPENMM_FREE_ENERGY_GBSAOBC_SOFTCORE_FORCE_PROXY_H_*/
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyGBVISoftcoreForceProxy.h
deleted
100644 → 0
View file @
c775bd19
#ifndef OPENMM_FREE_ENERGY_GBVI_SOFTCORE_FORCE_PROXY_H_
#define OPENMM_FREE_ENERGY_GBVI_SOFTCORE_FORCE_PROXY_H_
/* -------------------------------------------------------------------------- *
* OpenMMAmoeba *
* -------------------------------------------------------------------------- *
* 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) 2010 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/internal/windowsExport.h"
#include "openmm/serialization/SerializationProxy.h"
namespace
OpenMM
{
/**
* This is a proxy for serializing GBVISoftcoreForce objects.
*/
class
OPENMM_EXPORT
GBVISoftcoreForceProxy
:
public
SerializationProxy
{
public:
GBVISoftcoreForceProxy
();
void
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
;
void
*
deserialize
(
const
SerializationNode
&
node
)
const
;
};
}
// namespace OpenMM
#endif
/*OPENMM_FREE_ENERGY_GBVI_SOFTCORE_FORCE_PROXY_H_*/
plugins/freeEnergy/serialization/include/openmm/serialization/FreeEnergyNonbondedSoftcoreForceProxy.h
deleted
100644 → 0
View file @
c775bd19
#ifndef OPENMM_FREE_ENERGY_NONBONDED_SOFTCORE_FORCE_PROXY_H_
#define OPENMM_FREE_ENERGY_NONBONDED_SOFTCORE_FORCE_PROXY_H_
/* -------------------------------------------------------------------------- *
* OpenMMAmoeba *
* -------------------------------------------------------------------------- *
* 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) 2010 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/internal/windowsExport.h"
#include "openmm/serialization/SerializationProxy.h"
namespace
OpenMM
{
/**
* This is a proxy for serializing AmoebaUreyBradleyForce objects.
*/
class
OPENMM_EXPORT
NonbondedSoftcoreForceProxy
:
public
SerializationProxy
{
public:
NonbondedSoftcoreForceProxy
();
void
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
;
void
*
deserialize
(
const
SerializationNode
&
node
)
const
;
};
}
// namespace OpenMM
#endif
/*OPENMM_FREE_ENERGY_NONBONDED_SOFTCORE_FORCE_PROXY_H_*/
plugins/freeEnergy/serialization/src/FreeEnergyGBSAOBCSoftcoreProxy.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2010 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/FreeEnergyGBSAOBCSoftcoreForceProxy.h"
#include "openmm/serialization/SerializationNode.h"
#include "openmm/Force.h"
#include "openmm/GBSAOBCSoftcoreForce.h"
#include <sstream>
using
namespace
OpenMM
;
using
namespace
std
;
GBSAOBCSoftcoreForceProxy
::
GBSAOBCSoftcoreForceProxy
()
:
SerializationProxy
(
"GBSAOBCSoftcoreForce"
)
{
}
void
GBSAOBCSoftcoreForceProxy
::
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
{
node
.
setIntProperty
(
"version"
,
1
);
const
GBSAOBCSoftcoreForce
&
force
=
*
reinterpret_cast
<
const
GBSAOBCSoftcoreForce
*>
(
object
);
//node.setIntProperty("method", (int) force.getNonbondedMethod());
//node.setDoubleProperty("cutoff", force.getCutoffDistance());
node
.
setDoubleProperty
(
"soluteDielectric"
,
force
.
getSoluteDielectric
());
node
.
setDoubleProperty
(
"solventDielectric"
,
force
.
getSolventDielectric
());
node
.
setDoubleProperty
(
"nonPolarPrefactor"
,
force
.
getNonPolarPrefactor
());
SerializationNode
&
particles
=
node
.
createChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
force
.
getNumParticles
();
i
++
)
{
double
charge
,
radius
,
scale
,
nonPolarScalingFactor
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
scale
,
nonPolarScalingFactor
);
particles
.
createChildNode
(
"Particle"
).
setDoubleProperty
(
"q"
,
charge
).
setDoubleProperty
(
"r"
,
radius
).
setDoubleProperty
(
"scale"
,
scale
).
setDoubleProperty
(
"nonPolarScalingFactor"
,
nonPolarScalingFactor
);
}
}
void
*
GBSAOBCSoftcoreForceProxy
::
deserialize
(
const
SerializationNode
&
node
)
const
{
if
(
node
.
getIntProperty
(
"version"
)
!=
1
)
throw
OpenMMException
(
"Unsupported version number"
);
GBSAOBCSoftcoreForce
*
force
=
new
GBSAOBCSoftcoreForce
();
try
{
//force->setNonbondedMethod((GBSAOBCSoftcoreForce::NonbondedMethod) node.getIntProperty("method"));
//force->setCutoffDistance(node.getDoubleProperty("cutoff"));
force
->
setSoluteDielectric
(
node
.
getDoubleProperty
(
"soluteDielectric"
));
force
->
setSolventDielectric
(
node
.
getDoubleProperty
(
"solventDielectric"
));
force
->
setNonPolarPrefactor
(
node
.
getDoubleProperty
(
"nonPolarPrefactor"
));
const
SerializationNode
&
particles
=
node
.
getChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
(
int
)
particles
.
getChildren
().
size
();
i
++
)
{
const
SerializationNode
&
particle
=
particles
.
getChildren
()[
i
];
force
->
addParticle
(
particle
.
getDoubleProperty
(
"q"
),
particle
.
getDoubleProperty
(
"r"
),
particle
.
getDoubleProperty
(
"scale"
),
particle
.
getDoubleProperty
(
"nonPolarScalingFactor"
));
}
}
catch
(...)
{
delete
force
;
throw
;
}
return
force
;
}
plugins/freeEnergy/serialization/src/FreeEnergyGBVISoftcoreProxy.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2010 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/FreeEnergyGBVISoftcoreForceProxy.h"
#include "openmm/serialization/SerializationNode.h"
#include "openmm/GBVISoftcoreForce.h"
#include <sstream>
using
namespace
OpenMM
;
using
namespace
std
;
GBVISoftcoreForceProxy
::
GBVISoftcoreForceProxy
()
:
SerializationProxy
(
"GBVISoftcoreForce"
)
{
}
void
GBVISoftcoreForceProxy
::
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
{
node
.
setIntProperty
(
"version"
,
1
);
const
GBVISoftcoreForce
&
force
=
*
reinterpret_cast
<
const
GBVISoftcoreForce
*>
(
object
);
node
.
setIntProperty
(
"method"
,
(
int
)
force
.
getNonbondedMethod
());
node
.
setIntProperty
(
"brScaleMethod"
,
(
int
)
force
.
getBornRadiusScalingMethod
());
node
.
setDoubleProperty
(
"cutoff"
,
force
.
getCutoffDistance
());
node
.
setDoubleProperty
(
"soluteDielectric"
,
force
.
getSoluteDielectric
());
node
.
setDoubleProperty
(
"solventDielectric"
,
force
.
getSolventDielectric
());
node
.
setDoubleProperty
(
"quinticLwrLmtFctr"
,
force
.
getQuinticLowerLimitFactor
());
node
.
setDoubleProperty
(
"quinticUpprBrLmt"
,
force
.
getQuinticUpperBornRadiusLimit
());
SerializationNode
&
particles
=
node
.
createChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
force
.
getNumParticles
();
i
++
)
{
double
charge
,
radius
,
gamma
,
bornRadiusScaleFactor
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
gamma
,
bornRadiusScaleFactor
);
particles
.
createChildNode
(
"Particle"
).
setDoubleProperty
(
"q"
,
charge
).
setDoubleProperty
(
"r"
,
radius
).
setDoubleProperty
(
"gamma"
,
gamma
).
setDoubleProperty
(
"bRSclFctr"
,
bornRadiusScaleFactor
);
}
SerializationNode
&
bonds
=
node
.
createChildNode
(
"Bonds"
);
for
(
int
i
=
0
;
i
<
force
.
getNumBonds
();
i
++
)
{
int
particle1
,
particle2
;
double
distance
;
force
.
getBondParameters
(
i
,
particle1
,
particle2
,
distance
);
bonds
.
createChildNode
(
"Bond"
).
setIntProperty
(
"p1"
,
particle1
).
setIntProperty
(
"p2"
,
particle2
).
setDoubleProperty
(
"d"
,
distance
);
}
}
void
*
GBVISoftcoreForceProxy
::
deserialize
(
const
SerializationNode
&
node
)
const
{
if
(
node
.
getIntProperty
(
"version"
)
!=
1
)
throw
OpenMMException
(
"Unsupported version number"
);
GBVISoftcoreForce
*
force
=
new
GBVISoftcoreForce
();
try
{
force
->
setNonbondedMethod
((
GBVISoftcoreForce
::
NonbondedSoftcoreMethod
)
node
.
getIntProperty
(
"method"
));
force
->
setBornRadiusScalingMethod
((
GBVISoftcoreForce
::
BornRadiusScalingSoftcoreMethod
)
node
.
getIntProperty
(
"brScaleMethod"
));
force
->
setCutoffDistance
(
node
.
getDoubleProperty
(
"cutoff"
));
force
->
setSoluteDielectric
(
node
.
getDoubleProperty
(
"soluteDielectric"
));
force
->
setSolventDielectric
(
node
.
getDoubleProperty
(
"solventDielectric"
));
force
->
setQuinticLowerLimitFactor
(
node
.
getDoubleProperty
(
"quinticLwrLmtFctr"
));
force
->
setQuinticUpperBornRadiusLimit
(
node
.
getDoubleProperty
(
"quinticUpprBrLmt"
));
const
SerializationNode
&
particles
=
node
.
getChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
(
int
)
particles
.
getChildren
().
size
();
i
++
)
{
const
SerializationNode
&
particle
=
particles
.
getChildren
()[
i
];
force
->
addParticle
(
particle
.
getDoubleProperty
(
"q"
),
particle
.
getDoubleProperty
(
"r"
),
particle
.
getDoubleProperty
(
"gamma"
),
particle
.
getDoubleProperty
(
"bRSclFctr"
));
}
const
SerializationNode
&
bonds
=
node
.
getChildNode
(
"Bonds"
);
for
(
int
i
=
0
;
i
<
(
int
)
bonds
.
getChildren
().
size
();
i
++
)
{
const
SerializationNode
&
bond
=
bonds
.
getChildren
()[
i
];
force
->
addBond
(
bond
.
getIntProperty
(
"p1"
),
bond
.
getIntProperty
(
"p2"
),
bond
.
getDoubleProperty
(
"d"
));
}
}
catch
(...)
{
delete
force
;
throw
;
}
return
force
;
}
plugins/freeEnergy/serialization/src/FreeEnergyNonbondedSoftcoreForceProxy.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2010 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/FreeEnergyNonbondedSoftcoreForceProxy.h"
#include "openmm/serialization/SerializationNode.h"
#include "openmm/NonbondedSoftcoreForce.h"
#include <sstream>
using
namespace
OpenMM
;
using
namespace
std
;
NonbondedSoftcoreForceProxy
::
NonbondedSoftcoreForceProxy
()
:
SerializationProxy
(
"NonbondedSoftcoreForce"
)
{
}
void
NonbondedSoftcoreForceProxy
::
serialize
(
const
void
*
object
,
SerializationNode
&
node
)
const
{
node
.
setIntProperty
(
"version"
,
1
);
const
NonbondedSoftcoreForce
&
force
=
*
reinterpret_cast
<
const
NonbondedSoftcoreForce
*>
(
object
);
node
.
setIntProperty
(
"method"
,
(
int
)
force
.
getNonbondedMethod
());
node
.
setDoubleProperty
(
"cutoff"
,
force
.
getCutoffDistance
());
//node.setDoubleProperty("ewaldTolerance", force.getEwaldErrorTolerance());
node
.
setDoubleProperty
(
"rfDielectric"
,
force
.
getReactionFieldDielectric
());
//node.setIntProperty("dispersionCorrection", force.getUseDispersionCorrection());
SerializationNode
&
particles
=
node
.
createChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
force
.
getNumParticles
();
i
++
)
{
double
charge
,
sigma
,
epsilon
,
softcoreLJLambda
;
force
.
getParticleParameters
(
i
,
charge
,
sigma
,
epsilon
,
softcoreLJLambda
);
particles
.
createChildNode
(
"Particle"
).
setDoubleProperty
(
"q"
,
charge
).
setDoubleProperty
(
"sig"
,
sigma
).
setDoubleProperty
(
"eps"
,
epsilon
).
setDoubleProperty
(
"lambda"
,
softcoreLJLambda
);
}
SerializationNode
&
exceptions
=
node
.
createChildNode
(
"Exceptions"
);
for
(
int
i
=
0
;
i
<
force
.
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
,
softcoreLJLambda
;
force
.
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
,
softcoreLJLambda
);
exceptions
.
createChildNode
(
"Exception"
).
setIntProperty
(
"p1"
,
particle1
).
setIntProperty
(
"p2"
,
particle2
).
setDoubleProperty
(
"q"
,
chargeProd
).
setDoubleProperty
(
"sig"
,
sigma
).
setDoubleProperty
(
"eps"
,
epsilon
).
setDoubleProperty
(
"lambda"
,
softcoreLJLambda
);
}
}
void
*
NonbondedSoftcoreForceProxy
::
deserialize
(
const
SerializationNode
&
node
)
const
{
if
(
node
.
getIntProperty
(
"version"
)
!=
1
)
throw
OpenMMException
(
"Unsupported version number"
);
NonbondedSoftcoreForce
*
force
=
new
NonbondedSoftcoreForce
();
try
{
force
->
setNonbondedMethod
((
NonbondedSoftcoreForce
::
NonbondedSoftcoreMethod
)
node
.
getIntProperty
(
"method"
));
force
->
setCutoffDistance
(
node
.
getDoubleProperty
(
"cutoff"
));
//force->setEwaldErrorTolerance(node.getDoubleProperty("ewaldTolerance"));
force
->
setReactionFieldDielectric
(
node
.
getDoubleProperty
(
"rfDielectric"
));
//force->setUseDispersionCorrection(node.getIntProperty("dispersionCorrection"));
const
SerializationNode
&
particles
=
node
.
getChildNode
(
"Particles"
);
for
(
int
i
=
0
;
i
<
(
int
)
particles
.
getChildren
().
size
();
i
++
)
{
const
SerializationNode
&
particle
=
particles
.
getChildren
()[
i
];
force
->
addParticle
(
particle
.
getDoubleProperty
(
"q"
),
particle
.
getDoubleProperty
(
"sig"
),
particle
.
getDoubleProperty
(
"eps"
),
particle
.
getDoubleProperty
(
"lambda"
));
}
const
SerializationNode
&
exceptions
=
node
.
getChildNode
(
"Exceptions"
);
for
(
int
i
=
0
;
i
<
(
int
)
exceptions
.
getChildren
().
size
();
i
++
)
{
const
SerializationNode
&
exception
=
exceptions
.
getChildren
()[
i
];
force
->
addException
(
exception
.
getIntProperty
(
"p1"
),
exception
.
getIntProperty
(
"p2"
),
exception
.
getDoubleProperty
(
"q"
),
exception
.
getDoubleProperty
(
"sig"
),
exception
.
getDoubleProperty
(
"eps"
),
exception
.
getDoubleProperty
(
"lambda"
));
}
}
catch
(...)
{
delete
force
;
throw
;
}
return
force
;
}
plugins/freeEnergy/serialization/src/FreeEnergySerializationProxyRegistration.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* OpenMMAmoeba *
* -------------------------------------------------------------------------- *
* 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) 2010 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. *
* -------------------------------------------------------------------------- */
#ifdef WIN32
#include <windows.h>
#include <sstream>
#else
#include <dlfcn.h>
#include <dirent.h>
#include <cstdlib>
#endif
#include "openmm/OpenMMException.h"
#include "openmm/NonbondedSoftcoreForce.h"
#include "openmm/GBVISoftcoreForce.h"
#include "openmm/GBSAOBCSoftcoreForce.h"
#include "openmm/serialization/SerializationProxy.h"
#include "openmm/serialization/FreeEnergyNonbondedSoftcoreForceProxy.h"
#include "openmm/serialization/FreeEnergyGBSAOBCSoftcoreForceProxy.h"
#include "openmm/serialization/FreeEnergyGBVISoftcoreForceProxy.h"
#if defined(WIN32)
#include <windows.h>
extern
"C"
void
registerFreeEnergySerializationProxies
();
BOOL
WINAPI
DllMain
(
HANDLE
hModule
,
DWORD
ul_reason_for_call
,
LPVOID
lpReserved
)
{
if
(
ul_reason_for_call
==
DLL_PROCESS_ATTACH
)
registerFreeEnergySerializationProxies
();
return
TRUE
;
}
#else
extern
"C"
void
__attribute__
((
constructor
))
registerFreeEnergySerializationProxies
();
#endif
using
namespace
OpenMM
;
extern
"C"
void
registerFreeEnergySerializationProxies
()
{
SerializationProxy
::
registerProxy
(
typeid
(
NonbondedSoftcoreForce
),
new
NonbondedSoftcoreForceProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
GBSAOBCSoftcoreForce
),
new
GBSAOBCSoftcoreForceProxy
());
SerializationProxy
::
registerProxy
(
typeid
(
GBVISoftcoreForce
),
new
GBVISoftcoreForceProxy
());
}
plugins/freeEnergy/serialization/tests/CMakeLists.txt
deleted
100644 → 0
View file @
c775bd19
#
# Testing
#
ENABLE_TESTING
()
# Automatically create tests using files named "Test*.cpp"
FILE
(
GLOB TEST_PROGS
"*Test*.cpp"
)
FOREACH
(
TEST_PROG
${
TEST_PROGS
}
)
GET_FILENAME_COMPONENT
(
TEST_ROOT
${
TEST_PROG
}
NAME_WE
)
# All tests use shared libraries
ADD_EXECUTABLE
(
${
TEST_ROOT
}
${
TEST_PROG
}
)
TARGET_LINK_LIBRARIES
(
${
TEST_ROOT
}
${
OPENMM_SERIALIZATION_LIBRARY_NAME
}
${
OPENMM_FREE_ENERGY_SERIALIZATION_LIBRARY_NAME
}
${
OPENMM_FREE_ENERGY_LIBRARY_NAME
}
)
ADD_TEST
(
${
TEST_ROOT
}
${
EXECUTABLE_OUTPUT_PATH
}
/
${
TEST_ROOT
}
)
ENDFOREACH
(
TEST_PROG
${
TEST_PROGS
}
)
plugins/freeEnergy/serialization/tests/TestSerializeFreeEnergyGBSAOBCSoftcoreForce.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2010 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/internal/AssertionUtilities.h"
#include "openmm/GBSAOBCSoftcoreForce.h"
#include "openmm/serialization/XmlSerializer.h"
#include <iostream>
#include <sstream>
using
namespace
OpenMM
;
using
namespace
std
;
void
testSerialization
()
{
// Create a Force.
GBSAOBCSoftcoreForce
force
;
//force.setNonbondedMethod(GBSAOBCSoftcoreForce::CutoffPeriodic);
//force.setCutoffDistance(2.0);
force
.
setSoluteDielectric
(
5.1
);
force
.
setSolventDielectric
(
50.0
);
force
.
setNonPolarPrefactor
(
5.0
);
force
.
addParticle
(
1
,
0.1
,
0.01
,
0.5
);
force
.
addParticle
(
0.5
,
0.2
,
0.02
,
1.0
);
force
.
addParticle
(
-
0.5
,
0.3
,
0.03
,
1.1
);
// Serialize and then deserialize it.
stringstream
buffer
;
XmlSerializer
::
serialize
<
GBSAOBCSoftcoreForce
>
(
&
force
,
"Force"
,
buffer
);
GBSAOBCSoftcoreForce
*
copy
=
XmlSerializer
::
deserialize
<
GBSAOBCSoftcoreForce
>
(
buffer
);
// Compare the two forces to see if they are identical.
GBSAOBCSoftcoreForce
&
force2
=
*
copy
;
//ASSERT_EQUAL(force.getNonbondedMethod(), force2.getNonbondedMethod());
//ASSERT_EQUAL(force.getCutoffDistance(), force2.getCutoffDistance());
ASSERT_EQUAL
(
force
.
getSoluteDielectric
(),
force2
.
getSoluteDielectric
());
ASSERT_EQUAL
(
force
.
getSolventDielectric
(),
force2
.
getSolventDielectric
());
ASSERT_EQUAL
(
force
.
getNonPolarPrefactor
(),
force2
.
getNonPolarPrefactor
());
ASSERT_EQUAL
(
force
.
getNumParticles
(),
force2
.
getNumParticles
());
for
(
int
i
=
0
;
i
<
force
.
getNumParticles
();
i
++
)
{
double
charge1
,
radius1
,
scale1
,
nonPolarScalingFactor1
;
double
charge2
,
radius2
,
scale2
,
nonPolarScalingFactor2
;
force
.
getParticleParameters
(
i
,
charge1
,
radius1
,
scale1
,
nonPolarScalingFactor1
);
force2
.
getParticleParameters
(
i
,
charge2
,
radius2
,
scale2
,
nonPolarScalingFactor2
);
ASSERT_EQUAL
(
charge1
,
charge2
);
ASSERT_EQUAL
(
radius1
,
radius2
);
ASSERT_EQUAL
(
scale1
,
scale2
);
ASSERT_EQUAL
(
nonPolarScalingFactor1
,
nonPolarScalingFactor2
);
}
}
int
main
()
{
try
{
testSerialization
();
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
plugins/freeEnergy/serialization/tests/TestSerializeFreeEnergyGBVISoftcoreForce.cpp
deleted
100644 → 0
View file @
c775bd19
/* -------------------------------------------------------------------------- *
* 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) 2010 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/internal/AssertionUtilities.h"
#include "openmm/GBVISoftcoreForce.h"
#include "openmm/serialization/XmlSerializer.h"
#include <iostream>
#include <sstream>
using
namespace
OpenMM
;
using
namespace
std
;
void
testSerialization
()
{
// Create a Force.
GBVISoftcoreForce
force
;
force
.
setNonbondedMethod
(
GBVISoftcoreForce
::
CutoffPeriodic
);
force
.
setBornRadiusScalingMethod
(
GBVISoftcoreForce
::
QuinticSpline
);
force
.
setCutoffDistance
(
2.0
);
force
.
setSoluteDielectric
(
5.1
);
force
.
setSolventDielectric
(
50.0
);
force
.
setQuinticLowerLimitFactor
(
0.1
);
force
.
setQuinticUpperBornRadiusLimit
(
5.1
);
//force.setTanhParameters(5.1, 4.2, 1.3);
force
.
addParticle
(
1
,
0.1
,
0.01
,
0.1
);
force
.
addParticle
(
0.5
,
0.2
,
0.02
,
0.2
);
force
.
addParticle
(
-
0.5
,
0.3
,
0.03
,
0.3
);
force
.
addBond
(
0
,
1
,
2.0
);
force
.
addBond
(
3
,
5
,
1.2
);
// Serialize and then deserialize it.
stringstream
buffer
;
XmlSerializer
::
serialize
<
GBVISoftcoreForce
>
(
&
force
,
"Force"
,
buffer
);
GBVISoftcoreForce
*
copy
=
XmlSerializer
::
deserialize
<
GBVISoftcoreForce
>
(
buffer
);
// Compare the two forces to see if they are identical.
GBVISoftcoreForce
&
force2
=
*
copy
;
ASSERT_EQUAL
(
force
.
getNonbondedMethod
(),
force2
.
getNonbondedMethod
());
ASSERT_EQUAL
(
force
.
getCutoffDistance
(),
force2
.
getCutoffDistance
());
ASSERT_EQUAL
(
force
.
getSoluteDielectric
(),
force2
.
getSoluteDielectric
());
ASSERT_EQUAL
(
force
.
getSolventDielectric
(),
force2
.
getSolventDielectric
());
ASSERT_EQUAL
(
force
.
getQuinticLowerLimitFactor
(),
force2
.
getQuinticLowerLimitFactor
());
ASSERT_EQUAL
(
force
.
getQuinticUpperBornRadiusLimit
(),
force2
.
getQuinticUpperBornRadiusLimit
());
ASSERT_EQUAL
(
force
.
getBornRadiusScalingMethod
(),
force2
.
getBornRadiusScalingMethod
());
/*
double alpha1, beta1, gamma1;
double alpha2, beta2, gamma2;
force.getTanhParameters( alpha1, beta1, gamma1 );
force2.getTanhParameters( alpha2, beta2, gamma2 );
ASSERT_EQUAL(alpha1, alpha2);
ASSERT_EQUAL(beta1, beta2);
ASSERT_EQUAL(gamma1, gamma2);
*/
ASSERT_EQUAL
(
force
.
getNumParticles
(),
force2
.
getNumParticles
());
for
(
int
i
=
0
;
i
<
force
.
getNumParticles
();
i
++
)
{
double
charge1
,
radius1
,
scale1
,
bornRadiusScaleFactor1
;
double
charge2
,
radius2
,
scale2
,
bornRadiusScaleFactor2
;
force
.
getParticleParameters
(
i
,
charge1
,
radius1
,
scale1
,
bornRadiusScaleFactor1
);
force2
.
getParticleParameters
(
i
,
charge2
,
radius2
,
scale2
,
bornRadiusScaleFactor2
);
ASSERT_EQUAL
(
charge1
,
charge2
);
ASSERT_EQUAL
(
radius1
,
radius2
);
ASSERT_EQUAL
(
scale1
,
scale2
);
ASSERT_EQUAL
(
bornRadiusScaleFactor1
,
bornRadiusScaleFactor2
);
}
ASSERT_EQUAL
(
force
.
getNumBonds
(),
force2
.
getNumBonds
());
for
(
int
i
=
0
;
i
<
force
.
getNumBonds
();
i
++
)
{
int
a1
,
a2
,
b1
,
b2
;
double
da
,
db
;
force
.
getBondParameters
(
i
,
a1
,
a2
,
da
);
force2
.
getBondParameters
(
i
,
b1
,
b2
,
db
);
ASSERT_EQUAL
(
a1
,
b1
);
ASSERT_EQUAL
(
a2
,
b2
);
ASSERT_EQUAL
(
da
,
db
);
}
}
int
main
()
{
try
{
testSerialization
();
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
Prev
1
2
3
4
5
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