"plugins/vscode:/vscode.git/clone" did not exist on "f267c51a35cb6ae1686ff20121a8cf31c95cdbf4"
Commit 0308dbf8 authored by Mark Friedrichs's avatar Mark Friedrichs
Browse files

Moved gpuSetNonbondedSoftcoreParameters() to freeEnergyCudaGpu.cpp

parent 2c708e02
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
extern void OPENMMCUDA_EXPORT SetForcesSim(gpuContext gpu); extern void OPENMMCUDA_EXPORT SetForcesSim(gpuContext gpu);
#include <cmath> #include <cmath>
#include <iostream>
#include <sstream> #include <sstream>
#include <limits> #include <limits>
#include <cstring> #include <cstring>
...@@ -255,6 +256,149 @@ void freeEnergyGpuSetConstants( freeEnergyGpuContext freeEnergyGpu ){ ...@@ -255,6 +256,149 @@ void freeEnergyGpuSetConstants( freeEnergyGpuContext freeEnergyGpu ){
} }
extern "C"
void freeEnergyGpuSetPeriodicBoxSize( freeEnergyGpuContext freeEnergyGpu, float xsize, float ysize, float zsize)
{
freeEnergyGpu->freeEnergySim.periodicBoxSizeX = xsize;
freeEnergyGpu->freeEnergySim.periodicBoxSizeY = ysize;
freeEnergyGpu->freeEnergySim.periodicBoxSizeZ = zsize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeX = 1.0f/xsize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeY = 1.0f/ysize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeZ = 1.0f/zsize;
freeEnergyGpu->freeEnergySim.recipBoxSizeX = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeX;
freeEnergyGpu->freeEnergySim.recipBoxSizeY = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeY;
freeEnergyGpu->freeEnergySim.recipBoxSizeZ = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeZ;
freeEnergyGpu->freeEnergySim.cellVolume = freeEnergyGpu->freeEnergySim.periodicBoxSizeX*freeEnergyGpu->freeEnergySim.periodicBoxSizeY*freeEnergyGpu->freeEnergySim.periodicBoxSizeZ;
gpuSetPeriodicBoxSize( freeEnergyGpu->gpuContext, xsize, ysize, zsize );
}
extern "C"
void gpuSetNonbondedSoftcoreParameters( freeEnergyGpuContext freeEnergyGpu, float epsfac, const std::vector<int>& atom, const std::vector<float>& c6,
const std::vector<float>& c12, const std::vector<float>& q,
const std::vector<float>& softcoreLJLambdaArray, const std::vector<char>& symbol,
const std::vector<std::vector<int> >& exclusions, CudaFreeEnergyNonbondedMethod method,
float cutoffDistance, float solventDielectric ){
unsigned int numberOfParticles = c6.size();
gpuContext gpu = freeEnergyGpu->gpuContext;
int paddedNumberOfAtoms = gpu->sim.paddedNumberOfAtoms;
// sanity checks
if( paddedNumberOfAtoms < 1 ){
std::stringstream msg;
msg << "gpuSetNonbondedSoftcoreParameters: number of padded atoms=" << gpu->sim.paddedNumberOfAtoms << " is less than 1.";
throw OpenMM::OpenMMException( msg.str() );
}
if( freeEnergyGpu->gpuContext->sim.atoms != numberOfParticles ){
std::stringstream msg;
msg << "gpuSetNonbondedSoftcoreParameters: number of atoms in gpuContext does not match input count: " << freeEnergyGpu->gpuContext->sim.atoms << " " << numberOfParticles << ".";
throw OpenMM::OpenMMException( msg.str() );
}
freeEnergyGpu->freeEnergySim.epsfac = epsfac;
freeEnergyGpu->freeEnergySim.nonbondedMethod = method;
freeEnergyGpu->freeEnergySim.nonbondedCutoff = cutoffDistance;
freeEnergyGpu->freeEnergySim.nonbondedCutoffSqr = cutoffDistance*cutoffDistance;
gpu->sim.nonbondedCutoff = cutoffDistance;
gpu->sim.nonbondedCutoffSqr = cutoffDistance*cutoffDistance;
if( cutoffDistance > 0.0f ){
freeEnergyGpu->freeEnergySim.reactionFieldK = pow(cutoffDistance, -3.0f)*(solventDielectric-1.0f)/(2.0f*solventDielectric+1.0f);
freeEnergyGpu->freeEnergySim.reactionFieldC = (1.0f / cutoffDistance)*(3.0f*solventDielectric)/(2.0f*solventDielectric+1.0f);
gpu->sim.reactionFieldK = freeEnergyGpu->freeEnergySim.reactionFieldK;
gpu->sim.reactionFieldC = freeEnergyGpu->freeEnergySim.reactionFieldC;
} else {
freeEnergyGpu->freeEnergySim.reactionFieldK = 0.0f;
freeEnergyGpu->freeEnergySim.reactionFieldC = 0.0f;
}
setExclusions( gpu, exclusions );
// parameters
freeEnergyGpu->psSigEps4 = new CUDAStream<float4>( paddedNumberOfAtoms, 1, "freeEnergyGpuSigEps4");
freeEnergyGpu->freeEnergySim.pSigEps4 = freeEnergyGpu->psSigEps4->_pDevData;
for( unsigned int ii = 0; ii < numberOfParticles; ii++ ){
float p1 = 0.5f;
float p2 = 0.0f;
if( (c6[ii] > 0.0f) && (c12[ii] > 0.0f) ){
p1 = 0.5f * powf(c12[ii] / c6[ii], 1.0f / 6.0f);
p2 = c6[ii] * sqrtf(1.0f / c12[ii]);
}
/*
if (symbol.size() > 0)
freeEnergyGpu->pAtomSymbol[ii] = symbol[ii];
*/
(*freeEnergyGpu->psSigEps4)[ii].x = p1;
(*freeEnergyGpu->psSigEps4)[ii].y = p2;
(*freeEnergyGpu->psSigEps4)[ii].z = softcoreLJLambdaArray[ii];
(*freeEnergyGpu->psSigEps4)[ii].w = q[ii];
}
// Dummy out extra atom data
for( unsigned int ii = numberOfParticles; ii < paddedNumberOfAtoms; ii++ ){
(*freeEnergyGpu->psSigEps4)[ii].x = 1.0f;
(*freeEnergyGpu->psSigEps4)[ii].y = 0.0f;
(*freeEnergyGpu->psSigEps4)[ii].z = 0.0f;
(*freeEnergyGpu->psSigEps4)[ii].w = 0.0f;
(*gpu->psPosq4)[ii].x = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].y = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].z = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].w = 0.0f;
}
if( freeEnergyGpu->log ){
(void) fprintf( freeEnergyGpu->log,"freeEnergyGpuSetNonbondedSoftcoreParameters: %5u padded=%u epsfac=%14.7e method=%d cutoffDistance=%9.2f solventDielectric=%9.2f\n",
numberOfParticles, freeEnergyGpu->gpuContext->sim.paddedNumberOfAtoms, epsfac, method, cutoffDistance, solventDielectric );
#ifdef PARAMETER_PRINT
int maxPrint = MAX_PARAMETER_PRINT;
for (unsigned int ii = 0; ii < numberOfParticles; ii++){
(void) fprintf( freeEnergyGpu->log,"%6u sig[%14.7e %14.7e] lambda=%10.3f q=%10.3f\n",
ii,
(*freeEnergyGpu->psSigEps4)[ii].x, (*freeEnergyGpu->psSigEps4)[ii].y, (*freeEnergyGpu->psSigEps4)[ii].z, (*freeEnergyGpu->psSigEps4)[ii].w );
if( ii == maxPrint && ii < freeEnergyGpu->gpuContext->sim.paddedNumberOfAtoms - maxPrint ){
ii = numberOfParticles - maxPrint;
}
}
unsigned int offset = paddedNumberOfAtoms - maxPrint;
if( offset > 0 ){
if( offset > numberOfParticles ){
(void) fprintf( freeEnergyGpu->log,"Dummy padded entries\n" );
for (unsigned int ii = offset; ii < paddedNumberOfAtoms; ii++){
(void) fprintf( freeEnergyGpu->log,"%6u sig[%14.7e %14.7e] lambda=%10.3f q=%10.3f\n",
ii,
(*freeEnergyGpu->psSigEps4)[ii].x, (*freeEnergyGpu->psSigEps4)[ii].y, (*freeEnergyGpu->psSigEps4)[ii].z, (*freeEnergyGpu->psSigEps4)[ii].w );
}
}
}
#endif
(void) fflush( freeEnergyGpu->log );
}
// upload data to board
freeEnergyGpu->psSigEps4->Upload();
gpu->psPosq4->Upload();
return;
}
/**--------------------------------------------------------------------------------------- /**---------------------------------------------------------------------------------------
Get threads/block Get threads/block
......
...@@ -49,149 +49,6 @@ void SetCalculateCDLJSoftcoreGpuSim( freeEnergyGpuContext freeEnergyGpu ){ ...@@ -49,149 +49,6 @@ void SetCalculateCDLJSoftcoreGpuSim( freeEnergyGpuContext freeEnergyGpu ){
RTERROR(status, "cudaMemcpyToSymbol: SetCalculateCDLJSoftcoreGpuSim copy to feSimDev failed"); RTERROR(status, "cudaMemcpyToSymbol: SetCalculateCDLJSoftcoreGpuSim copy to feSimDev failed");
} }
extern "C"
void freeEnergyGpuSetPeriodicBoxSize( freeEnergyGpuContext freeEnergyGpu, float xsize, float ysize, float zsize)
{
freeEnergyGpu->freeEnergySim.periodicBoxSizeX = xsize;
freeEnergyGpu->freeEnergySim.periodicBoxSizeY = ysize;
freeEnergyGpu->freeEnergySim.periodicBoxSizeZ = zsize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeX = 1.0f/xsize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeY = 1.0f/ysize;
freeEnergyGpu->freeEnergySim.invPeriodicBoxSizeZ = 1.0f/zsize;
freeEnergyGpu->freeEnergySim.recipBoxSizeX = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeX;
freeEnergyGpu->freeEnergySim.recipBoxSizeY = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeY;
freeEnergyGpu->freeEnergySim.recipBoxSizeZ = 2.0f*PI/freeEnergyGpu->freeEnergySim.periodicBoxSizeZ;
freeEnergyGpu->freeEnergySim.cellVolume = freeEnergyGpu->freeEnergySim.periodicBoxSizeX*freeEnergyGpu->freeEnergySim.periodicBoxSizeY*freeEnergyGpu->freeEnergySim.periodicBoxSizeZ;
gpuSetPeriodicBoxSize( freeEnergyGpu->gpuContext, xsize, ysize, zsize );
}
extern "C"
void gpuSetNonbondedSoftcoreParameters( freeEnergyGpuContext freeEnergyGpu, float epsfac, const std::vector<int>& atom, const std::vector<float>& c6,
const std::vector<float>& c12, const std::vector<float>& q,
const std::vector<float>& softcoreLJLambdaArray, const std::vector<char>& symbol,
const std::vector<std::vector<int> >& exclusions, CudaFreeEnergyNonbondedMethod method,
float cutoffDistance, float solventDielectric ){
unsigned int numberOfParticles = c6.size();
gpuContext gpu = freeEnergyGpu->gpuContext;
int paddedNumberOfAtoms = gpu->sim.paddedNumberOfAtoms;
// sanity checks
if( paddedNumberOfAtoms < 1 ){
std::stringstream msg;
msg << "gpuSetNonbondedSoftcoreParameters: number of padded atoms=" << gpu->sim.paddedNumberOfAtoms << " is less than 1.";
throw OpenMM::OpenMMException( msg.str() );
}
if( freeEnergyGpu->gpuContext->sim.atoms != numberOfParticles ){
std::stringstream msg;
msg << "gpuSetNonbondedSoftcoreParameters: number of atoms in gpuContext does not match input count: " << freeEnergyGpu->gpuContext->sim.atoms << " " << numberOfParticles << ".";
throw OpenMM::OpenMMException( msg.str() );
}
freeEnergyGpu->freeEnergySim.epsfac = epsfac;
freeEnergyGpu->freeEnergySim.nonbondedMethod = method;
freeEnergyGpu->freeEnergySim.nonbondedCutoff = cutoffDistance;
freeEnergyGpu->freeEnergySim.nonbondedCutoffSqr = cutoffDistance*cutoffDistance;
gpu->sim.nonbondedCutoff = cutoffDistance;
gpu->sim.nonbondedCutoffSqr = cutoffDistance*cutoffDistance;
if( cutoffDistance > 0.0f ){
freeEnergyGpu->freeEnergySim.reactionFieldK = pow(cutoffDistance, -3.0f)*(solventDielectric-1.0f)/(2.0f*solventDielectric+1.0f);
freeEnergyGpu->freeEnergySim.reactionFieldC = (1.0f / cutoffDistance)*(3.0f*solventDielectric)/(2.0f*solventDielectric+1.0f);
gpu->sim.reactionFieldK = freeEnergyGpu->freeEnergySim.reactionFieldK;
gpu->sim.reactionFieldC = freeEnergyGpu->freeEnergySim.reactionFieldC;
} else {
freeEnergyGpu->freeEnergySim.reactionFieldK = 0.0f;
freeEnergyGpu->freeEnergySim.reactionFieldC = 0.0f;
}
setExclusions( gpu, exclusions );
// parameters
freeEnergyGpu->psSigEps4 = new CUDAStream<float4>( paddedNumberOfAtoms, 1, "freeEnergyGpuSigEps4");
freeEnergyGpu->freeEnergySim.pSigEps4 = freeEnergyGpu->psSigEps4->_pDevData;
for( unsigned int ii = 0; ii < numberOfParticles; ii++ ){
float p1 = 0.5f;
float p2 = 0.0f;
if( (c6[ii] > 0.0f) && (c12[ii] > 0.0f) ){
p1 = 0.5f * powf(c12[ii] / c6[ii], 1.0f / 6.0f);
p2 = c6[ii] * sqrtf(1.0f / c12[ii]);
}
/*
if (symbol.size() > 0)
freeEnergyGpu->pAtomSymbol[ii] = symbol[ii];
*/
(*freeEnergyGpu->psSigEps4)[ii].x = p1;
(*freeEnergyGpu->psSigEps4)[ii].y = p2;
(*freeEnergyGpu->psSigEps4)[ii].z = softcoreLJLambdaArray[ii];
(*freeEnergyGpu->psSigEps4)[ii].w = q[ii];
}
// Dummy out extra atom data
for( unsigned int ii = numberOfParticles; ii < paddedNumberOfAtoms; ii++ ){
(*freeEnergyGpu->psSigEps4)[ii].x = 1.0f;
(*freeEnergyGpu->psSigEps4)[ii].y = 0.0f;
(*freeEnergyGpu->psSigEps4)[ii].z = 0.0f;
(*freeEnergyGpu->psSigEps4)[ii].w = 0.0f;
(*gpu->psPosq4)[ii].x = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].y = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].z = 100000.0f + ii * 10.0f;
(*gpu->psPosq4)[ii].w = 0.0f;
}
if( freeEnergyGpu->log ){
(void) fprintf( freeEnergyGpu->log,"freeEnergyGpuSetNonbondedSoftcoreParameters: %5u padded=%u epsfac=%14.7e method=%d cutoffDistance=%9.2f solventDielectric=%9.2f\n",
numberOfParticles, freeEnergyGpu->gpuContext->sim.paddedNumberOfAtoms, epsfac, method, cutoffDistance, solventDielectric );
#ifdef PARAMETER_PRINT
int maxPrint = MAX_PARAMETER_PRINT;
for (unsigned int ii = 0; ii < numberOfParticles; ii++){
(void) fprintf( freeEnergyGpu->log,"%6u sig[%14.7e %14.7e] lambda=%10.3f q=%10.3f\n",
ii,
(*freeEnergyGpu->psSigEps4)[ii].x, (*freeEnergyGpu->psSigEps4)[ii].y, (*freeEnergyGpu->psSigEps4)[ii].z, (*freeEnergyGpu->psSigEps4)[ii].w );
if( ii == maxPrint && ii < freeEnergyGpu->gpuContext->sim.paddedNumberOfAtoms - maxPrint ){
ii = numberOfParticles - maxPrint;
}
}
unsigned int offset = paddedNumberOfAtoms - maxPrint;
if( offset > 0 ){
if( offset > numberOfParticles ){
(void) fprintf( freeEnergyGpu->log,"Dummy padded entries\n" );
for (unsigned int ii = offset; ii < paddedNumberOfAtoms; ii++){
(void) fprintf( freeEnergyGpu->log,"%6u sig[%14.7e %14.7e] lambda=%10.3f q=%10.3f\n",
ii,
(*freeEnergyGpu->psSigEps4)[ii].x, (*freeEnergyGpu->psSigEps4)[ii].y, (*freeEnergyGpu->psSigEps4)[ii].z, (*freeEnergyGpu->psSigEps4)[ii].w );
}
}
}
#endif
(void) fflush( freeEnergyGpu->log );
}
// upload data to board
freeEnergyGpu->psSigEps4->Upload();
gpu->psPosq4->Upload();
return;
}
extern "C" extern "C"
bool gpuIsAvailableSoftcore() bool gpuIsAvailableSoftcore()
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment