00001
00002 #ifndef __PENCIL_API_H__
00003 #define __PENCIL_API_H__
00004
00005 #include "pencilfft.h"
00006
00007 inline void configureLineFFTInfo (LineFFTInfo *info,
00008 int sizeX, int sizeY, int sizeZ,
00009 int grainX, int grainY, int grainZ,
00010 CkCallback *kcallback,
00011 LineFFTCompletion complid,
00012 bool normalize)
00013 {
00014 info->sizeX = sizeX;
00015 info->sizeY = sizeY;
00016 info->sizeZ = sizeZ;
00017
00018 info->grainX = grainX;
00019 info->grainY = grainY;
00020 info->grainZ = grainZ;
00021
00022 if (kcallback)
00023 info->kSpaceCallback = *kcallback;
00024
00025 info->completionId = complid;
00026 info->normalize = normalize;
00027 }
00028
00029
00030 inline void createLineFFTArray (LineFFTInfo *info) {
00031
00032 CkAssert (info->sizeX > 0);
00033 CkAssert (info->sizeY > 0);
00034 CkAssert (info->sizeZ > 0);
00035
00036 CkAssert (info->grainX > 0);
00037 CkAssert (info->grainY > 0);
00038 CkAssert (info->grainZ > 0);
00039
00040 info->xProxy = CProxy_LineFFTArray::ckNew();
00041 info->yProxy = CProxy_LineFFTArray::ckNew();
00042 info->zProxy = CProxy_LineFFTArray::ckNew();
00043
00044 int x, y, z;
00045
00046 double pe = 0.0;
00047 double stride =
00048 (1.0 *CkNumPes() * info->grainZ * info->grainY)/
00049 (info->sizeZ * info->sizeY);
00050
00051 for (pe = 0.0, z = 0; z < (info->sizeZ)/(info->grainZ); z ++) {
00052 for (y = 0; y < (info->sizeY)/(info->grainY); y++) {
00053 if(pe >= CkNumPes()) pe = pe - CkNumPes();
00054 info->xProxy(y, z).insert(*info, (int) PHASE_X, (int) pe);
00055 pe += stride;
00056 }
00057 }
00058 info->xProxy.doneInserting();
00059
00060 stride =
00061 (1.0 *CkNumPes() * info->grainX * info->grainZ)/
00062 (info->sizeX * info->sizeZ);
00063
00064 for (pe=1.0, x = 0; x < (info->sizeX)/(info->grainX); x ++) {
00065 for (z = 0; z < (info->sizeZ)/(info->grainZ); z ++) {
00066 if(pe >= CkNumPes()) pe = pe - CkNumPes();
00067 info->yProxy(z, x).insert(*info, (int) PHASE_Y, (int) pe);
00068 pe += stride;
00069 }
00070 }
00071 info->yProxy.doneInserting();
00072
00073 stride =
00074 (1.0 *CkNumPes() * info->grainY * info->grainX)/
00075 (info->sizeY * info->sizeX);
00076
00077 for (pe=0.0, y = 0; y < (info->sizeY)/(info->grainY); y ++) {
00078 for (x = 0; x < (info->sizeX)/(info->grainX); x ++) {
00079 if(pe >= CkNumPes()) pe = pe - CkNumPes();
00080 info->zProxy(x, y).insert(*info, (int) PHASE_Z, (int) pe);
00081 pe += stride;
00082 }
00083 }
00084 info->zProxy.doneInserting();
00085 }
00086
00087
00088 inline void startLineFFTArray (LineFFTInfo *info) {
00089 info->xProxy.startFFT ();
00090 }
00091
00092 #endif