1 #ifndef PMESOLVERUTIL_H
2 #define PMESOLVERUTIL_H
30 const int jblock,
const int kblock,
31 int& i0,
int& i1,
int& j0,
int& j1,
int& k0,
int& k1) {
33 int isize, jsize, ksize;
45 isize = pmeGrid.
K1/2+1;
54 ksize = pmeGrid.
K1/2+1;
60 jsize = pmeGrid.
K1/2+1;
66 NAMD_bug(
"getPencilDim, invalid permutation");
70 if (jblock < 0 || jblock >= jblocks || kblock < 0 || kblock >= kblocks)
71 NAMD_bug(
"getPencilDim, invalid block indices");
76 j0 = jsize*jblock/jblocks;
77 j1 = jsize*(jblock+1)/jblocks - 1;
79 k0 = ksize*kblock/kblocks;
80 k1 = ksize*(kblock+1)/kblocks - 1;
87 const int iblock,
const int jblock,
const int kblock,
88 int& i0,
int& i1,
int& j0,
int& j1,
int& k0,
int& k1) {
90 getPencilDim(pmeGrid, permutation, jblock, kblock, i0, i1, j0, j1, k0, k1);
108 NAMD_bug(
"getBlockDim, invalid permutation");
112 if (iblock < 0 || iblock >= iblocks)
113 NAMD_bug(
"getBlockDim, invalid block index");
117 i0 = isize*iblock/iblocks;
118 i1 = isize*(iblock+1)/iblocks - 1;
136 float* dataSrc_in,
int dataSrcSize_in,
137 float* dataDst_in,
int dataDstSize_in,
138 int permutation,
PmeGrid pmeGrid,
141 if (dataSrc_in != NULL && dataSrc_in == dataDst_in)
142 NAMD_bug(
"FFTCompute::init, only out-of-place FFTs supported");
144 int permutationDst = permutation;
149 if (dataSrc_in == NULL) {
151 dataSrcSize = getDataSizeRequired(permutation, pmeGrid, jblock, kblock);
155 if (dataSrcSize_in < getDataSizeRequired(permutation, pmeGrid, jblock, kblock))
156 NAMD_bug(
"FFTCompute::init, invalid dataSrcSize_in");
162 if (dataDst_in == NULL) {
164 dataDstSize = getDataSizeRequired(permutationDst, pmeGrid, jblock, kblock);
168 if (dataDstSize_in < getDataSizeRequired(permutationDst, pmeGrid, jblock, kblock))
169 NAMD_bug(
"FFTCompute::init, invalid dataDstSize_in");
177 dataDstSize < getDataSizeRequired(permutationDst, pmeGrid, jblock, kblock) ||
178 dataSrcSize < getDataSizeRequired(permutation, pmeGrid, jblock, kblock))
179 NAMD_bug(
"FFTCompute::init, error setting up data buffers");
182 if (pmePencilType == 3) {
185 NAMD_bug(
"FFTCompute::init, 3D FFT requires a single pencil");
186 int n[3] = {pmeGrid.
K1, pmeGrid.
K2, pmeGrid.
K3};
188 }
else if (pmePencilType == 1) {
189 int i0, i1, j0, j1, k0, k1;
190 getPencilDim(pmeGrid, permutation, jblock, kblock, i0, i1, j0, j1, k0, k1);
191 int n[1] = {i1-i0+1};
192 int howmany = (j1-j0+1)*(k1-k0+1);
194 plan1DX(n, howmany, flags);
196 plan1DY(n, howmany, flags);
198 plan1DZ(n, howmany, flags);
200 NAMD_bug(
"FFTCompute::init, invalid permutation");
202 }
else if (pmePencilType == 2) {
204 int i0, i1, j0, j1, k0, k1;
205 getPencilDim(pmeGrid, permutation, 0, kblock, i0, i1, j0, j1, k0, k1);
206 int n[2] = {pmeGrid.
K1, pmeGrid.
K2};
207 int howmany = k1-k0+1;
208 plan2D(n, howmany, flags);
210 NAMD_bug(
"FFTCompute::init, invalid pmePencilType");
232 int getDataSizeRequired(
int permutation,
PmeGrid pmeGrid,
238 int i0, i1, j0, j1, k0, k1;
240 i0, i1, j0, j1, k0, k1);
242 int size = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
254 virtual float* allocateData(
const int dataSizeRequired)=0;
255 virtual void plan3D(
int *n,
int flags)=0;
256 virtual void plan2D(
int *n,
int howmany,
int flags)=0;
257 virtual void plan1DX(
int *n,
int howmany,
int flags)=0;
258 virtual void plan1DY(
int *n,
int howmany,
int flags)=0;
259 virtual void plan1DZ(
int *n,
int howmany,
int flags)=0;
278 pmeGrid(pmeGrid), permutation(permutation),
279 jblock(jblock), kblock(kblock), kappa(kappa) {
281 bm1 =
new double[pmeGrid.
K1];
282 bm2 =
new double[pmeGrid.
K2];
283 bm3 =
new double[pmeGrid.
K3];
301 virtual void solve(
Lattice &lattice,
const bool doEnergy,
const bool doVirial,
float* data)=0;
303 virtual void getVirial(
double *virial)=0;
327 pmeGrid(pmeGrid), jblock(jblock), kblock(kblock),
data(NULL) {
354 static inline double calcGridCoord(
const double x,
const double recip11,
const int nfftx) {
357 return (
double)((double)nfftx*(w - (floor(w + 0.5) - 0.5)));
361 const double recip11,
const double recip22,
const double recip33,
362 const int nfftx,
const int nffty,
const int nfftz,
363 double &frx,
double &fry,
double &frz) {
366 frx = (double)((
double)nfftx*(w - (floor(w + 0.5) - 0.5)));
368 fry = (double)((
double)nffty*(w - (floor(w + 0.5) - 0.5)));
370 frz = (double)((
double)nfftz*(w - (floor(w + 0.5) - 0.5)));
374 const float recip11,
const float recip22,
const float recip33,
375 const int nfftx,
const int nffty,
const int nfftz,
376 float &frx,
float &fry,
float &frz) {
378 w = x*recip11 + 2.0f;
379 frx = (float)(nfftx*(w - (floorf(w + 0.5f) - 0.5f)));
380 w = y*recip22 + 2.0f;
381 fry = (float)(nffty*(w - (floorf(w + 0.5f) - 0.5f)));
382 w = z*recip33 + 2.0f;
383 frz = (float)(nfftz*(w - (floorf(w + 0.5f) - 0.5f)));
387 const int nfftx,
const int nffty,
const int nfftz,
float &frx,
float &fry,
float &frz) {
388 frx = (float)(nfftx)*
x;
389 fry = (float)(nffty)*
y;
390 frz = (float)(nfftz)*
z;
394 const int nfftx,
const int nffty,
const int nfftz,
double &frx,
double &fry,
double &frz) {
395 frx = (double)(nfftx)*
x;
396 fry = (double)(nffty)*
y;
397 frz = (double)(nfftz)*
z;
404 #include <hip/hip_vector_types.h>
422 pmeGrid(pmeGrid), permutation(permutation), jblock(jblock), kblock(kblock) {
424 int i0, i1, j0, j1, k0, k1;
425 getPencilDim(pmeGrid, permutation, jblock, kblock, i0, i1, j0, j1, k0, k1);
429 dataSize = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
431 switch(permutation) {
442 NAMD_bug(
"PmeTranspose::PmeTranspose, invalid permutation");
450 for (
int iblock=0;iblock <
nblock;iblock++) {
454 int x0, y0dummy, y1dummy, z0dummy, z1dummy;
455 getBlockDim(pmeGrid, permutation, iblock, jblock, kblock, x0, x1, y0dummy, y1dummy, z0dummy, z1dummy);
467 #endif // PMESOLVERUTIL_H
virtual void gatherForce(Lattice &lattice, CudaForce *force)=0
void compute_b_moduli(double *bm, int K, int order)
virtual void solve(Lattice &lattice, const bool doEnergy, const bool doVirial, float *data)=0
PmeRealSpaceCompute(PmeGrid pmeGrid, const int jblock, const int kblock)
static __thread atom * atoms
virtual void backward()=0
static int getPencilIndexY(const PmeGrid &pmeGrid, const int y)
static void getPencilDim(const PmeGrid &pmeGrid, const int permutation, const int jblock, const int kblock, int &i0, int &i1, int &j0, int &j1, int &k0, int &k1)
static void calcGridCoord(const float x, const float y, const float z, const float recip11, const float recip22, const float recip33, const int nfftx, const int nffty, const int nfftz, float &frx, float &fry, float &frz)
virtual void transposeXYZtoYZX(const float2 *data)=0
static void calcGridCoord(const float x, const float y, const float z, const int nfftx, const int nffty, const int nfftz, float &frx, float &fry, float &frz)
virtual void transposeXYZtoZXY(const float2 *data)=0
PmeTranspose(PmeGrid pmeGrid, const int permutation, const int jblock, const int kblock)
static double calcGridCoord(const double x, const double recip11, const int nfftx)
void NAMD_bug(const char *err_msg)
PmeKSpaceCompute(PmeGrid pmeGrid, const int permutation, const int jblock, const int kblock, double kappa)
virtual void getVirial(double *virial)=0
static void getBlockDim(const PmeGrid &pmeGrid, const int permutation, const int iblock, const int jblock, const int kblock, int &i0, int &i1, int &j0, int &j1, int &k0, int &k1)
static void calcGridCoord(const double x, const double y, const double z, const double recip11, const double recip22, const double recip33, const int nfftx, const int nffty, const int nfftz, double &frx, double &fry, double &frz)
void init(float *dataSrc_in, int dataSrcSize_in, float *dataDst_in, int dataDstSize_in, int permutation, PmeGrid pmeGrid, int pmePencilType, int jblock, int kblock, int flags)
static void calcGridCoord(const double x, const double y, const double z, const int nfftx, const int nffty, const int nfftz, double &frx, double &fry, double &frz)
virtual void spreadCharge(Lattice &lattice)=0
virtual ~PmeKSpaceCompute()
PatchInfo(int x, int y, int z, int w)
virtual ~PmeRealSpaceCompute()
static int getPencilIndexZ(const PmeGrid &pmeGrid, const int z)
virtual double getEnergy()=0
virtual void copyAtoms(const int numAtoms, const CudaAtom *atoms)=0