18 #ifndef IPPL_FFT_FFT_H
19 #define IPPL_FFT_FFT_H
31 template <
class T,
unsigned Dim>
class LField;
51 template <
class Transform,
size_t Dim,
class T>
57 template <
size_t Dim,
class T>
94 lengths[d] = cdomain[d].length();
97 int transformTypes[
Dim];
100 for (d=0; d<
Dim; ++d) {
102 normFact /= lengths[d];
106 #ifdef IPPL_DKS_OPENCL
108 base.setAPI(
"OpenCL", 6);
109 base.setDevice(
"-gpu", 4);
116 base.setAPI(
"Cuda", 4);
117 base.setDevice(
"-gpu", 4);
123 base.setAPI(
"OpenMP", 6);
124 base.setDevice(
"-mic", 4);
146 void transform(
int direction, ComplexField_t& f, ComplexField_t& g,
147 const bool& constInput=
false);
151 void transform(
const char* directionName, ComplexField_t& f,
152 ComplexField_t& g,
const bool& constInput=
false);
156 void transform(
int direction, ComplexField_t& f);
178 begdim = (direction == +1) ? 0 : (nTransformDims-1);
179 enddim = (direction == +1) ? nTransformDims : -1;
180 for (idim = begdim; idim != enddim; idim += direction) {
184 bool skipTranspose =
false;
187 if (idim == begdim) {
189 const Domain_t& first_dom = tempLayouts_m[idim]->getDomain();
192 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
193 (in_dom[0].length() == first_dom[0].length()) &&
200 if (idim == enddim-direction) {
202 const Domain_t& last_dom = tempLayouts_m[idim]->getDomain();
205 skipTranspose = ( (in_dom[0].sameBase(last_dom[0])) &&
206 (in_dom[0].length() == last_dom[0].length()) &&
211 if (!skipTranspose) {
213 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
218 temp = tempFields_m[idim];
220 else if (idim == enddim-direction && temp != &f) {
236 for (l_i = temp->
begin_if(); l_i != l_end; ++l_i) {
243 localdata = ldf->
getP();
246 int nstrips = 1, length = ldf->
size(0);
247 for (d=1; d<
Dim; ++d) nstrips *= ldf->
size(d);
248 for (
int istrip=0; istrip<nstrips; ++istrip) {
300 template <
size_t Dim,
class T>
303 const char* directionName,
306 const bool& constInput)
309 transform(dir, f, g, constInput);
336 FFT(
const Domain_t& cdomain,
const bool transformTheseDims[1U],
357 const bool& constInput=
false);
399 const char* directionName,
402 const bool& constInput)
405 transform(dir, f, g, constInput);
415 const char* directionName,
427 template <
size_t Dim,
class T>
470 const bool& constInput=
false);
471 void transform(
const char* directionName,
RealField_t& f,
478 void transformDKSRC(
int direction,
RealField_t &f,
void* real_ptr,
void* comp_ptr,
479 DKSOPAL &dksbase,
int streamId = -1,
const bool& constInput=
false);
485 const bool& constInput=
false);
493 void transformDKSCR(
int direction,
RealField_t& g,
void* real_ptr,
void* comp_ptr,
494 DKSOPAL &dksbase,
int streamId = -1,
const bool& constInput=
false);
544 template <
size_t Dim,
class T>
547 const char* directionName,
550 const bool& constInput)
553 transform(dir, f, g, constInput);
560 template <
size_t Dim,
class T>
563 const char* directionName,
566 const bool& constInput)
569 transform(dir, f, g, constInput);
600 const bool transformTheseDims[1U],
const bool&
compressTemps=
false);
621 const bool& constInput=
false);
622 void transform(
const char* directionName,
RealField_t& f,
630 const bool& constInput=
false);
671 const char* directionName,
674 const bool& constInput)
677 transform(dir, f, g, constInput);
687 const char* directionName,
690 const bool& constInput)
693 transform(dir, f, g, constInput);
700 template <
size_t Dim,
class T>
722 const bool transformTheseDims[
Dim],
723 const bool sineTransformDims[Dim],
const bool&
compressTemps=
false);
756 const bool& constInput=
false);
757 void transform(
const char* directionName,
RealField_t& f,
765 const bool& constInput=
false);
779 const bool& constInput=
false);
780 void transform(
const char* directionName,
RealField_t& f,
787 void transform(
const char* directionName,
RealField_t& f);
802 bool sineTransformDims_m[
Dim];
842 template <
size_t Dim,
class T>
845 const char* directionName,
848 const bool& constInput)
851 transform(dir, f, g, constInput);
858 template <
size_t Dim,
class T>
861 const char* directionName,
864 const bool& constInput)
867 transform(dir, f, g, constInput);
874 template <
size_t Dim,
class T>
877 const char* directionName,
880 const bool& constInput)
883 transform(dir, f, g, constInput);
890 template <
size_t Dim,
class T>
893 const char* directionName,
922 FFT(
const Domain_t& rdomain,
const bool sineTransformDims[1U],
941 const bool& constInput=
false);
942 void transform(
const char* directionName,
RealField_t& f,
949 void transform(
const char* directionName,
RealField_t& f);
977 const char* directionName,
980 const bool& constInput)
983 transform(dir, f, g, constInput);
993 const char* directionName,
1001 #endif // IPPL_FFT_FFT_H
std::complex< T > Complex_t
Layout_t & getLayout() const
void setup(unsigned numTransformDims, const int *transformTypes, const int *axisLengths)
std::complex< T > Complex_t
const Domain_t * complexDomain_m
std::complex< T > Complex_t
const Domain_t & getDomain(void) const
get our domain
std::complex< T > Complex_t
RealField_t * tempRField_m
FFT(const Domain_t &cdomain, const bool &compressTemps=false)
BareField< Complex_t, Dim > ComplexField_t
FFTBase< Dim, T >::Domain_t Domain_t
LField< Complex_t, Dim > ComplexLField_t
FieldLayout< 1U > Layout_t
Layout_t * tempRLayouts_m
LField< T, Dim > RealLField_t
Layout_t ** tempLayouts_m
void Uncompress(bool fill_domain=true)
size_t numSineTransforms_m
FFTBase< 1U, T >::Domain_t Domain_t
BareField< Complex_t, 1U > ComplexField_t
BareField< Complex_t, 1U > ComplexField_t
void transform(const char *directionName, ComplexField_t &f)
BareField< T, Dim > RealField_t
FFTBase< 1U, T >::Domain_t Domain_t
unsigned numTransformDims(void) const
query number of transform dimensions
ComplexField_t ** tempFields_m
FFTBase< 1U, T >::Domain_t Domain_t
ComplexField_t * tempFields_m
Layout_t ** tempLayouts_m
InternalFFT_t & getEngine(void)
access the internal FFT Engine
FieldLayout< 1U > Layout_t
LField< T, 1U > RealLField_t
BareField< T, 1U > RealField_t
LField< T, 1U > RealLField_t
BareField< T, Dim > RealField_t
ComplexField_t * tempFields_m
BareField< T, 1U > RealField_t
Precision_t & getNormFact(void)
get the FFT normalization factor
BareField< Complex_t, Dim > ComplexField_t
LField< Complex_t, Dim > ComplexLField_t
std::complex< T > Complex_t
ac_id_larray::const_iterator const_iterator_if
FFTBase< Dim, T >::Domain_t Domain_t
LField< Complex_t, Dim > ComplexLField_t
FieldLayout< Dim > Layout_t
void callFFT(unsigned transformDim, int direction, Complex_t *data)
FieldLayout< 1U > Layout_t
RealField_t * tempRFields_m
const GuardCellSizes< Dim > & getGC() const
RealField_t ** tempRFields_m
FieldLayout< Dim > Layout_t
e_dim_tag getDistribution(unsigned int d) const
BareField< Complex_t, Dim > ComplexField_t
ComplexField_t ** tempFields_m
LField< T, Dim > RealLField_t
Layout_t ** tempLayouts_m
bool compressTemps(void) const
do we compress temps?
FFTBase< Dim, T >::Domain_t Domain_t
Layout_t ** tempRLayouts_m
ComplexField_t ** tempFields_m
bool checkDomain(const Domain_t &dom1, const Domain_t &dom2) const
compare indexes of two domains
int getDirection(const char *directionName) const
translate direction name string into dimension number
LField< Complex_t, 1U > ComplexLField_t
int size(unsigned d) const
const NDIndex< Dim > & getDomain() const
LField< Complex_t, 1U > ComplexLField_t
FieldLayout< Dim > Layout_t
Inform & endl(Inform &inf)