#ifndef __GPU_FREE_ENERGY_KERNELS_H__
#define __GPU_FREE_ENERGY_KERNELS_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) 2009 Stanford University and the Authors. *
* Authors: Scott Le Grand, Peter Eastman *
* Contributors: *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as published *
* by the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see . *
* -------------------------------------------------------------------------- */
#include "gputypes.h"
#include "cudatypes.h"
#include "GpuNonbondedSoftcore.h"
#include "GpuLJ14Softcore.h"
#include "GpuObcGbsaSoftcore.h"
#include "GpuGBVISoftcore.h"
#include
// Function prototypes
// CDLJ softcore
// setup methods called from CudaFreeEnergyKernels
// nonbonded and 1-4 ixns
extern "C"
GpuNonbondedSoftcore* gpuSetNonbondedSoftcoreParameters(gpuContext gpu, float epsfac, const std::vector& atom, const std::vector& c6,
const std::vector& c12, const std::vector& q,
const std::vector& softcoreLJLambdaArray, const std::vector& symbol,
const std::vector >& exclusions, CudaNonbondedMethod method);
extern "C"
GpuLJ14Softcore* gpuSetLJ14SoftcoreParameters(gpuContext gpu, float epsfac, float fudge, const std::vector& atom1,
const std::vector& atom2, const std::vector& c6, const std::vector& c12,
const std::vector& q1, const std::vector& q2, const std::vector& softcoreLJLambdaArray);
// delete supplemtentary objects, ...
extern "C"
void gpuDeleteNonbondedSoftcoreParameters( void* gpuNonbondedSoftcore);
// write address's to device
extern "C"
void SetCalculateCDLJSoftcoreGpuSim( gpuContext gpu );
extern "C"
void SetCalculateCDLJSoftcoreSupplementarySim( float* gpuParticleSoftCoreLJLambda);
extern "C"
void SetCalculateLocalSoftcoreGpuSim( gpuContext gpu );
// kernel calls to device
extern "C"
void kCalculateCDLJSoftcoreForces(gpuContext gpu );
extern void kCalculateLocalSoftcoreForces( gpuContext gpu );
// GB/VI softcore
// setup method called from CudaFreeEnergyKernels
extern "C"
GpuGBVISoftcore* gpuSetGBVISoftcoreParameters(gpuContext gpu, float innerDielectric, float solventDielectric, const std::vector& atom, const std::vector& radius,
const std::vector& gamma, const std::vector& scaledRadii,
const std::vector& bornRadiusScaleFactors, const std::vector& quinticSplineParameters);
// delete supplemtentary objects, ...
extern "C"
void gpuDeleteGBVISoftcoreParameters( void* gpuNonbondedSoftcore);
// write address's to device
extern "C"
void SetCalculateGBVISoftcoreForcesSim( gpuContext gpu, float* softCoreLJLambda);
extern "C"
void SetCalculateGBVISoftcoreBornSumGpuSim( gpuContext gpu);
extern "C"
void SetCalculateGBVISoftcoreSupplementarySim( GpuGBVISoftcore* gpuGBVISoftcore );
// kernel calls to device
extern void kReduceGBVIBornSumQuinticScaling( gpuContext gpu, GpuGBVISoftcore* gpuGBVISoftcore );
extern void kCalculateGBVISoftcoreBornSum( gpuContext gpu );
extern void kReduceGBVIBornForcesQuinticScaling( gpuContext gpu );
// Obc softcore
// setup method called from CudaFreeEnergyKernels
/**
* Initialize parameters for Cuda Obc softcore
*
* @param gpu gpu context
* @param innerDielectric solute dielectric
* @param solventDielectric solvent dielectric
* @param radius intrinsic Born radii
* @param scale Obc scaling factors
* @param charge atomic charges (possibly overwritten by other methods?)
* @param nonPolarScalingFactors non-polar scaling factors
*
*/
extern "C"
GpuObcGbsaSoftcore* gpuSetObcSoftcoreParameters(gpuContext gpu, float innerDielectric, float solventDielectric, float nonPolarPrefactor,
const std::vector& radius, const std::vector& scale,
const std::vector& charge, const std::vector& nonPolarScalingFactors);
// delete supplemtentary objects, ...
extern "C"
void gpuDeleteObcSoftcoreParameters( void* gpuNonbondedSoftcore);
// write address's to device
extern "C"
void SetCalculateObcGbsaSoftcoreBornSumSim( gpuContext gpu );
extern "C"
void SetCalculateObcGbsaSoftcoreNonPolarScalingFactorsSim( float* nonPolarScalingFactors );
// this method and kCalculateObcGbsaSoftcoreForces2() are being
// used until changes in OpenMM version are made
extern "C"
void SetCalculateObcGbsaSoftcoreForces2Sim( gpuContext gpu );
// kernel calls to device
extern void kReduceObcGbsaSoftcoreBornForces( gpuContext gpu );
extern void kCalculateObcGbsaSoftcoreBornSum( gpuContext gpu );
// this method is not needed; the OpenMM version can be used
extern void kCalculateObcGbsaSoftcoreForces2( gpuContext gpu );
// shared
extern "C"
void SetCalculateCDLJObcGbsaSoftcoreGpu1Sim( gpuContext gpu );
extern "C"
void SetCalculateCDLJObcGbsaSoftcoreSupplementary1Sim( float* gpuParticleSoftCoreLJLambda);
extern void kCalculateCDLJObcGbsaSoftcoreForces1( gpuContext gpu );
#endif //__GPU_FREE_ENERGY_KERNELS_H__