29 template <
size_t Dim,
class T>
32 const bool transformTheseDims[
Dim],
33 const bool& compressTemps)
35 transformTheseDims, compressTemps)
40 int* lengths =
new int[nTransformDims];
42 for (d=0; d<nTransformDims; ++d)
46 int* transformTypes =
new int[nTransformDims];
49 for (d=0; d<nTransformDims; ++d) {
51 normFact /= lengths[d];
56 delete [] transformTypes;
67 template <
size_t Dim,
class T>
79 serialParallel[0] =
SERIAL;
84 tempLayouts_m =
new Layout_t*[nTransformDims];
88 for (
size_t dim=0; dim<nTransformDims; ++dim) {
95 ndip[0] = ndic[activeDim];
96 for (d=1; d<
Dim; ++d) {
97 size_t nextDim = activeDim + d;
98 if (nextDim >= Dim) nextDim -=
Dim;
99 ndip[d] = ndic[nextDim];
106 if (!this->
compressTemps()) (*tempFields_m[dim]).Uncompress();
116 template <
size_t Dim,
class T>
129 for (
size_t d=0; d<nTransformDims; ++d) {
130 delete tempFields_m[d];
131 delete tempLayouts_m[d];
133 delete [] tempFields_m;
134 delete [] tempLayouts_m;
142 template <
size_t Dim,
class T>
148 const bool& constInput)
154 const Layout_t& in_layout = f.getLayout();
155 const Domain_t& in_dom = in_layout.getDomain();
156 const Layout_t& out_layout = g.getLayout();
157 const Domain_t& out_dom = out_layout.getDomain();
167 ComplexField_t* temp = &f;
169 Complex_t* localdata;
172 begdim = (direction == +1) ? 0 : static_cast<int>(nTransformDims-1);
173 enddim = (direction == +1) ? static_cast<int>(nTransformDims) : -1;
174 for (idim = begdim; idim != enddim; idim += direction) {
178 bool skipTranspose =
false;
181 if (idim == begdim && !constInput) {
183 const Domain_t& first_dom = tempLayouts_m[idim]->getDomain();
186 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
187 (in_dom[0].length() == first_dom[0].length()) &&
188 (in_layout.getDistribution(0) ==
SERIAL) &&
194 if (idim == enddim-direction) {
196 const Domain_t& last_dom = tempLayouts_m[idim]->getDomain();
199 skipTranspose = ( (out_dom[0].sameBase(last_dom[0])) &&
200 (out_dom[0].length() == last_dom[0].length()) &&
201 (out_layout.getDistribution(0) ==
SERIAL) &&
205 if (!skipTranspose) {
207 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
208 (*temp)[temp->getLayout().getDomain()];
212 temp = tempFields_m[idim];
214 else if (idim == enddim-direction && temp != &g) {
219 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
227 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
228 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
231 ComplexLField_t* ldf = (*l_i).second.get();
235 localdata = ldf->getP();
238 int nstrips = 1, length = ldf->size(0);
239 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
240 for (
int istrip=0; istrip<nstrips; ++istrip) {
254 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
266 template <
size_t Dim,
class T>
277 const Layout_t& in_layout = f.getLayout();
278 const Domain_t& in_dom = in_layout.getDomain();
287 ComplexField_t* temp = &f;
289 Complex_t* localdata;
292 begdim = (direction == +1) ? 0 : static_cast<int>(nTransformDims-1);
293 enddim = (direction == +1) ? static_cast<int>(nTransformDims) : -1;
294 for (idim = begdim; idim != enddim; idim += direction) {
298 bool skipTranspose =
false;
301 if (idim == begdim) {
303 const Domain_t& first_dom = tempLayouts_m[idim]->getDomain();
306 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
307 (in_dom[0].length() == first_dom[0].length()) &&
308 (in_layout.getDistribution(0) ==
SERIAL) &&
314 if (idim == enddim-direction) {
316 const Domain_t& last_dom = tempLayouts_m[idim]->getDomain();
319 skipTranspose = ( (in_dom[0].sameBase(last_dom[0])) &&
320 (in_dom[0].length() == last_dom[0].length()) &&
321 (in_layout.getDistribution(0) ==
SERIAL) &&
325 if (!skipTranspose) {
327 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
328 (*temp)[temp->getLayout().getDomain()];
332 temp = tempFields_m[idim];
334 else if (idim == enddim-direction && temp != &f) {
339 f[in_dom] = (*temp)[temp->getLayout().getDomain()];
347 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
348 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
351 ComplexLField_t* ldf = (*l_i).second.get();
355 localdata = ldf->getP();
358 int nstrips = 1, length = ldf->size(0);
359 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
360 for (
int istrip=0; istrip<nstrips; ++istrip) {
375 f[in_dom] = (*temp)[temp->getLayout().getDomain()];
399 const bool transformTheseDims[1U],
const bool& compressTemps)
401 transformTheseDims, compressTemps)
409 size_t nTransformDims = 1U;
412 length = cdomain[0].length();
418 normFact = 1.0 / length;
434 const bool& compressTemps)
442 length = cdomain[0].length();
448 normFact = 1.0 / length;
493 delete tempLayouts_m;
507 const bool& constInput)
514 const Layout_t& in_layout = f.getLayout();
515 const Domain_t& in_dom = in_layout.getDomain();
516 const Layout_t& out_layout = g.getLayout();
517 const Domain_t& out_dom = out_layout.getDomain();
522 ComplexField_t* temp = &f;
524 Complex_t* localdata;
530 const Domain_t& temp_dom = tempLayouts_m->getDomain();
532 bool skipTranspose =
false;
538 skipTranspose = ( (in_dom[0].sameBase(temp_dom[0])) &&
539 (in_dom[0].length() == temp_dom[0].length()) &&
540 (in_layout.numVnodes() == 1) &&
550 skipFinal = ( (out_dom[0].sameBase(temp_dom[0])) &&
551 (out_dom[0].length() == temp_dom[0].length()) &&
552 (out_layout.numVnodes() == 1) &&
555 if (!skipTranspose) {
557 (*tempFields_m) = (*temp);
576 typename ComplexField_t::const_iterator_if l_i = temp->begin_if();
577 if (l_i != temp->end_if()) {
579 ComplexLField_t* ldf = (*l_i).second.get();
583 localdata = ldf->getP();
622 const Layout_t& in_layout = f.getLayout();
623 const Domain_t& in_dom = in_layout.getDomain();
627 ComplexField_t* temp = &f;
629 Complex_t* localdata;
635 const Domain_t& temp_dom = tempLayouts_m->getDomain();
643 skipTranspose = ( (in_dom[0].sameBase(temp_dom[0])) &&
644 (in_dom[0].length() == temp_dom[0].length()) &&
645 (in_layout.numVnodes() == 1) &&
648 if (!skipTranspose) {
650 (*tempFields_m) = (*temp);
658 typename ComplexField_t::const_iterator_if l_i = temp->begin_if();
659 if (l_i != temp->end_if()) {
661 ComplexLField_t* ldf = (*l_i).second.get();
665 localdata = ldf->getP();
702 template <
size_t Dim,
class T>
706 const bool transformTheseDims[Dim],
const bool& compressTemps)
708 transformTheseDims, compressTemps),
709 complexDomain_m(cdomain), serialAxes_m(1)
713 int* lengths =
new int[nTransformDims];
715 for (d=0; d<nTransformDims; ++d)
719 int* transformTypes =
new int[nTransformDims];
723 normFact /= lengths[0];
724 for (d=1; d<nTransformDims; ++d) {
726 normFact /= lengths[d];
731 delete [] transformTypes;
743 template <
size_t Dim,
class T>
744 FFT<RCTransform,Dim,T>::FFT(
747 const bool& compressTemps,
750 complexDomain_m(cdomain), serialAxes_m(serialAxes)
757 for (d=0; d<
Dim; ++d)
758 lengths[d] = rdomain[d].length();
761 int transformTypes[
Dim];
765 normFact /= lengths[0];
766 for (d=1; d<
Dim; ++d) {
768 normFact /= lengths[d];
783 template <
size_t Dim,
class T>
795 size_t d,
d2, activeDim;
804 for (d=0; d <
Dim; ++d) {
806 NserialParallel[d] = (d < (size_t) serialAxes_m ?
SERIAL :
PARALLEL);
813 for (d=0; d<
Dim; ++d) {
814 if (d == activeDim) {
816 if ( complexDomain_m[d].length() !=
817 (domain[d].length()/2 + 1) ) match =
false;
821 if (complexDomain_m[d].length() != domain[d].length()) match =
false;
825 "Domains provided for real and complex Fields are incompatible!");
828 tempLayouts_m =
new Layout_t*[nTransformDims];
836 ndip[0] = domain[activeDim];
837 ndipc[0] = complexDomain_m[activeDim];
838 for (d=1; d<
Dim; ++d) {
839 size_t nextDim = activeDim + d;
840 if (nextDim >= Dim) nextDim -=
Dim;
841 ndip[d] = domain[nextDim];
842 ndipc[d] = complexDomain_m[nextDim];
855 int fftorder[
Dim], tmporder[
Dim];
856 int nofft = nTransformDims;
857 for (d=0; d < nTransformDims; ++d)
859 for (d=0; d <
Dim; ++d) {
862 for (d2=0; d2 < nTransformDims; ++
d2) {
871 fftorder[nofft++] = d;
877 for (d=0; d < (Dim - 1); ++d)
878 fftorder[d] = fftorder[d+1];
879 fftorder[Dim-1] = nofft;
885 while (dim < nTransformDims) {
888 for (sp=0; sp < serialAxes_m && dim < nTransformDims; ++sp, ++dim) {
891 for (d=0; d <
Dim; ++d)
892 ndip[d] = complexDomain_m[fftorder[d]];
899 if (serialAxes_m > 1) {
900 tmporder[0] = fftorder[0];
901 for (d=0; d < (size_t) (serialAxes_m-1); ++d)
902 fftorder[d] = fftorder[d+1];
903 fftorder[serialAxes_m - 1] = tmporder[0];
909 for (d=0; d <
Dim; ++d)
910 tmporder[d] = fftorder[d];
911 for (d=0; d <
Dim; ++d)
912 fftorder[d] = tmporder[(d + serialAxes_m) %
Dim];
921 template <
size_t Dim,
class T>
929 for (
size_t d=0; d<nTransformDims; ++d) {
930 delete tempFields_m[d];
931 delete tempLayouts_m[d];
933 delete [] tempFields_m;
934 delete [] tempLayouts_m;
936 delete tempRLayout_m;
940 template <
size_t Dim,
class T>
946 const bool& constInput)
952 const Layout_t& in_layout = f.getLayout();
953 const Domain_t& in_dom = in_layout.getDomain();
954 const Layout_t& out_layout = g.getLayout();
955 const Domain_t& out_dom = out_layout.getDomain();
969 RealField_t* tempR = tempRField_m;
972 bool skipTemp =
true;
975 if ( !(in_layout == *tempRLayout_m) ) {
979 for (d=0; d<
Dim; ++d)
980 if (in_layout.getDistribution(d) != tempRLayout_m->getDistribution(d))
984 if (in_layout.numVnodes() != tempRLayout_m->numVnodes())
1005 (*tempR)[tempR->getDomain()] = f[in_dom];
1010 ComplexField_t* temp = tempFields_m[0];
1014 if (nTransformDims == 1) {
1015 bool skipTemp =
true;
1018 if (!(out_layout == *tempLayouts_m[0])) {
1021 for (d=0; d<
Dim; ++d)
1022 if (out_layout.getDistribution(d) !=
1023 tempLayouts_m[0]->getDistribution(d))
1026 if ( out_layout.numVnodes() != tempLayouts_m[0]->numVnodes() )
1041 typename RealField_t::const_iterator_if rl_i, rl_end = tempR->end_if();
1042 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
1043 for (rl_i = tempR->begin_if(); rl_i != rl_end; ++rl_i, ++cl_i) {
1045 RealLField_t* rldf = (*rl_i).second.get();
1046 ComplexLField_t* cldf = (*cl_i).second.get();
1053 T* localreal = rldf->getP();
1054 Complex_t* localcomp = cldf->getP();
1057 int nstrips = 1, lengthreal = rldf->size(0), lengthcomp = cldf->size(0);
1058 for (d=1; d<
Dim; ++d)
1059 nstrips *= rldf->size(d);
1062 for (
int istrip=0; istrip<nstrips; ++istrip) {
1064 for (
int ilen=0; ilen<lengthreal; ilen+=2) {
1065 localcomp[ilen/2] = Complex_t(localreal[ilen],localreal[ilen+1]);
1073 localreal += lengthreal;
1074 localcomp += lengthcomp;
1086 Complex_t* localdata;
1089 for (idim = 1; idim < nTransformDims; ++idim) {
1091 bool skipTranspose =
false;
1095 if (idim == nTransformDims-1) {
1097 const Domain_t& last_dom = tempLayouts_m[idim]->getDomain();
1103 out_dom[0].sameBase(last_dom[0]) &&
1104 out_dom[0].length() == last_dom[0].length() &&
1105 out_layout.getDistribution(0) ==
SERIAL);
1108 if (!skipTranspose) {
1110 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
1111 (*temp)[temp->getLayout().getDomain()];
1116 temp = tempFields_m[idim];
1118 }
else if (idim == nTransformDims-1) {
1124 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
1134 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
1135 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
1137 ComplexLField_t* ldf = (*l_i).second.get();
1143 localdata = ldf->getP();
1146 int nstrips = 1, length = ldf->size(0);
1147 for (d=1; d<
Dim; ++d)
1148 nstrips *= ldf->size(d);
1150 for (
int istrip=0; istrip<nstrips; ++istrip) {
1156 localdata += length;
1168 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
1186 template <
size_t Dim,
class T>
1192 const bool& constInput)
1198 const Layout_t& in_layout = f.getLayout();
1199 const Domain_t& in_dom = in_layout.getDomain();
1200 const Layout_t& out_layout = g.getLayout();
1201 const Domain_t& out_dom = out_layout.getDomain();
1213 ComplexField_t* temp = &f;
1216 Complex_t* localdata;
1219 for (idim = nTransformDims-1; idim != 0; --idim) {
1223 bool skipTranspose =
false;
1226 if (idim == nTransformDims-1 && !constInput) {
1228 const Domain_t& first_dom = tempLayouts_m[idim]->getDomain();
1231 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
1232 (in_dom[0].length() == first_dom[0].length()) &&
1233 (in_layout.getDistribution(0) ==
SERIAL) &&
1237 if (!skipTranspose) {
1239 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
1240 (*temp)[temp->getLayout().getDomain()];
1245 temp = tempFields_m[idim];
1249 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
1250 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
1253 ComplexLField_t* ldf = (*l_i).second.get();
1259 localdata = ldf->getP();
1262 int nstrips = 1, length = ldf->size(0);
1263 for (d=1; d<
Dim; ++d)
1264 nstrips *= ldf->size(d);
1266 for (
int istrip=0; istrip<nstrips; ++istrip) {
1272 localdata += length;
1283 bool skipTemp =
true;
1286 if (!(out_layout == *tempRLayout_m)) {
1289 for (d=0; d<
Dim; ++d)
1290 if (out_layout.getDistribution(d) != tempRLayout_m->getDistribution(d))
1293 if ( out_layout.numVnodes() != tempRLayout_m->numVnodes() )
1304 tempR = tempRField_m;
1307 if (nTransformDims == 1 && !constInput) {
1311 if (!(in_layout == *tempLayouts_m[0])) {
1314 for (d=0; d<
Dim; ++d)
1315 if (in_layout.getDistribution(d) !=
1316 tempLayouts_m[0]->getDistribution(d))
1319 if ( in_layout.numVnodes() != tempLayouts_m[0]->numVnodes() )
1333 (*tempFields_m[0])[tempLayouts_m[0]->
getDomain()] =
1334 (*temp)[temp->getLayout().getDomain()];
1339 temp = tempFields_m[0];
1343 typename RealField_t::const_iterator_if rl_i, rl_end = tempR->end_if();
1344 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
1345 for (rl_i = tempR->begin_if(); rl_i != rl_end; ++rl_i, ++cl_i) {
1347 RealLField_t* rldf = (*rl_i).second.get();
1348 ComplexLField_t* cldf = (*cl_i).second.get();
1355 T* localreal = rldf->getP();
1356 Complex_t* localcomp = cldf->getP();
1359 int nstrips = 1, lengthreal = rldf->size(0), lengthcomp = cldf->size(0);
1360 for (d=1; d<
Dim; ++d)
1361 nstrips *= rldf->size(d);
1363 for (
int istrip=0; istrip<nstrips; ++istrip) {
1369 for (
int ilen=0; ilen<lengthreal; ilen+=2) {
1370 localreal[ilen] =
real(localcomp[ilen/2]);
1371 localreal[ilen+1] =
imag(localcomp[ilen/2]);
1375 localreal += lengthreal;
1376 localcomp += lengthcomp;
1389 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
1417 const bool transformTheseDims[1U],
const bool& compressTemps)
1419 transformTheseDims, compressTemps),
1420 complexDomain_m(cdomain)
1422 size_t nTransformDims = 1U;
1425 length = rdomain[0].length();
1431 normFact = 1.0 / length;
1434 this->
getEngine().
setup(nTransformDims, &transformType, &length);
1448 const bool& compressTemps)
1450 complexDomain_m(cdomain)
1459 length = rdomain[0].length();
1465 normFact = 1.0 / length;
1491 if ( complexDomain_m[0].length() !=
1492 (domain[0].length()/2 + 1) ) match =
false;
1494 "Domains provided for real and complex Fields are incompatible!");
1499 this->tempRField_m =
new RealField_t(*tempRLayout_m);
1501 if (!this->
compressTemps()) this->tempRField_m->Uncompress();
1508 if (!this->
compressTemps()) this->tempFields_m->Uncompress();
1526 delete tempFields_m;
1527 delete tempLayouts_m;
1528 delete this->tempRField_m;
1529 delete tempRLayout_m;
1542 const bool& constInput)
1549 const Layout_t& in_layout = f.getLayout();
1550 const Domain_t& in_dom = in_layout.getDomain();
1551 const Layout_t& out_layout = g.getLayout();
1552 const Domain_t& out_dom = out_layout.getDomain();
1554 this->
checkDomain(complexDomain_m,out_dom),
true);
1557 RealField_t* tempR = this->tempRField_m;
1560 bool skipTemp =
true;
1562 if ( !(in_layout == *tempRLayout_m) ) skipTemp =
false;
1563 if ( in_layout.getDistribution(0) !=
1564 tempRLayout_m->getDistribution(0) ) skipTemp =
false;
1565 if ( in_layout.numVnodes() != tempRLayout_m->numVnodes() )
1569 if (skipTemp) tempR = &f;
1580 ComplexField_t* temp = tempFields_m;
1582 bool skipFinal =
true;
1584 if ( !(out_layout == *tempLayouts_m) ) skipFinal =
false;
1585 if ( out_layout.getDistribution(0) !=
1586 tempLayouts_m->getDistribution(0) ) skipFinal =
false;
1587 if ( out_layout.numVnodes() != tempLayouts_m->numVnodes() )
1591 if (skipFinal) temp = &g;
1595 typename RealField_t::const_iterator_if rl_i = tempR->begin_if();
1596 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
1597 if (rl_i != tempR->end_if() && cl_i != temp->end_if()) {
1599 RealLField_t* rldf = (*rl_i).second.get();
1600 ComplexLField_t* cldf = (*cl_i).second.get();
1605 T* localreal = rldf->getP();
1606 Complex_t* localcomp = cldf->getP();
1608 int lengthreal = rldf->size(0);
1610 for (
int ilen=0; ilen<lengthreal; ilen+=2)
1611 localcomp[ilen/2] = Complex_t(localreal[ilen],localreal[ilen+1]);
1648 const bool& constInput)
1655 const Layout_t& in_layout = f.getLayout();
1656 const Domain_t& in_dom = in_layout.getDomain();
1657 const Layout_t& out_layout = g.getLayout();
1658 const Domain_t& out_dom = out_layout.getDomain();
1663 ComplexField_t* temp = &f;
1667 bool skipFinal =
true;
1669 if ( !(out_layout == *tempRLayout_m) ) skipFinal =
false;
1670 if ( out_layout.getDistribution(0) !=
1671 tempRLayout_m->getDistribution(0) ) skipFinal =
false;
1672 if ( out_layout.numVnodes() != tempRLayout_m->numVnodes() )
1679 tempR = this->tempRField_m;
1681 bool skipTemp =
true;
1686 if ( !(in_layout == *tempLayouts_m) ) skipTemp =
false;
1687 if ( in_layout.getDistribution(0) !=
1688 tempLayouts_m->getDistribution(0) ) skipTemp =
false;
1689 if ( in_layout.numVnodes() != tempLayouts_m->numVnodes() )
1701 (*tempFields_m) = (*temp);
1704 temp = tempFields_m;
1710 typename RealField_t::const_iterator_if rl_i = tempR->begin_if();
1711 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
1712 if (rl_i != tempR->end_if() && cl_i != temp->end_if()) {
1714 RealLField_t* rldf = (*rl_i).second.get();
1715 ComplexLField_t* cldf = (*cl_i).second.get();
1720 T* localreal = rldf->getP();
1721 Complex_t* localcomp = cldf->getP();
1723 int lengthreal = rldf->size(0);
1728 for (
int ilen=0; ilen<lengthreal; ilen+=2) {
1729 localreal[ilen] =
real(localcomp[ilen/2]);
1730 localreal[ilen+1] =
imag(localcomp[ilen/2]);
1768 template <
size_t Dim,
class T>
1772 const bool transformTheseDims[Dim],
const bool sineTransformDims[Dim],
1773 const bool& compressTemps)
1775 transformTheseDims, compressTemps),
1776 complexDomain_m(&cdomain)
1781 numSineTransforms_m = 0;
1782 for (d=0; d<
Dim; ++d) {
1783 sineTransformDims_m[d] = sineTransformDims[d];
1784 if (sineTransformDims[d]) {
1786 ++numSineTransforms_m;
1792 int* lengths =
new int[nTransformDims];
1793 for (d=0; d<nTransformDims; ++d)
1797 int* transformTypes =
new int[nTransformDims];
1800 bool foundRC =
false;
1801 for (d=0; d<nTransformDims; ++d) {
1804 normFact /= (2.0 * (lengths[d] + 1));
1806 else if (!foundRC) {
1808 normFact /= lengths[d];
1813 normFact /= lengths[d];
1818 this->
getEngine().
setup(nTransformDims, transformTypes, lengths);
1819 delete [] transformTypes;
1830 template <
size_t Dim,
class T>
1831 FFT<SineTransform,Dim,T>::FFT(
1834 const bool sineTransformDims[Dim],
const bool& compressTemps)
1836 complexDomain_m(&cdomain)
1841 numSineTransforms_m = 0;
1842 for (d=0; d<
Dim; ++d) {
1843 sineTransformDims_m[d] = sineTransformDims[d];
1844 if (sineTransformDims[d]) ++numSineTransforms_m;
1849 for (d=0; d<
Dim; ++d)
1850 lengths[d] = rdomain[d].length();
1853 int transformTypes[
Dim];
1856 bool foundRC =
false;
1857 for (d=0; d<
Dim; ++d) {
1858 if (sineTransformDims_m[d]) {
1860 normFact /= (2.0 * (lengths[d] + 1));
1862 else if (!foundRC) {
1864 normFact /= lengths[d];
1869 normFact /= lengths[d];
1885 template <
size_t Dim,
class T>
1886 FFT<SineTransform,Dim,T>::FFT(
1888 const bool sineTransformDims[Dim],
const bool& compressTemps)
1890 sineTransformDims, compressTemps)
1900 for (d=0; d<
Dim; ++d)
1901 sineTransformDims_m[d] = sineTransformDims[d];
1904 int* lengths =
new int[numSineTransforms_m];
1905 for (d=0; d<numSineTransforms_m; ++d)
1909 int* transformTypes =
new int[numSineTransforms_m];
1912 for (d=0; d<numSineTransforms_m; ++d) {
1914 normFact /= (2.0 * (lengths[d] + 1));
1918 this->
getEngine().
setup(numSineTransforms_m, transformTypes, lengths);
1919 delete [] transformTypes;
1930 template <
size_t Dim,
class T>
1931 FFT<SineTransform,Dim,T>::FFT(
1943 for (d=0; d<
Dim; ++d)
1944 sineTransformDims_m[d] =
true;
1948 for (d=0; d<
Dim; ++d)
1949 lengths[d] = rdomain[d].length();
1952 int transformTypes[
Dim];
1955 for (d=0; d<
Dim; ++d) {
1957 normFact /= (2.0 * (lengths[d] + 1));
1971 template <
size_t Dim,
class T>
1980 size_t d, dim, activeDim = 0;
1989 serialParallel[0] =
SERIAL;
1991 for (d=1; d<
Dim; ++d)
1995 if (nTransformDims > numSineTransforms_m) {
2001 while (d<Dim && !match) {
2002 if (this->
transformDim(d) && !sineTransformDims_m[d]) {
2010 for (d=0; d<
Dim; ++d) {
2011 if (d == activeDim) {
2013 if ( (*complexDomain_m)[d].length() !=
2014 (domain[d].length()/2 + 1) ) match =
false;
2018 if ( (*complexDomain_m)[d].length() !=
2019 domain[d].length() ) match =
false;
2023 "Domains provided for real and complex Fields are incompatible!");
2027 tempRLayouts_m =
new Layout_t*[numSineTransforms_m+1];
2028 tempRFields_m =
new RealField_t*[numSineTransforms_m+1];
2031 for (dim=0; dim<numSineTransforms_m; ++dim, ++icount) {
2033 while (!sineTransformDims_m[icount]) ++icount;
2036 ndip[0] = domain[icount];
2037 for (d=1; d<
Dim; ++d) {
2038 size_t nextDim = icount + d;
2039 if (nextDim >= Dim) nextDim -=
Dim;
2040 ndip[d] = domain[nextDim];
2045 tempRFields_m[dim] =
new RealField_t(*tempRLayouts_m[dim]);
2047 if (!this->
compressTemps()) (*tempRFields_m[dim]).Uncompress();
2051 ndip[0] = domain[activeDim];
2052 for (d=1; d<
Dim; ++d) {
2053 size_t nextDim = activeDim + d;
2054 if (nextDim >= Dim) nextDim -=
Dim;
2055 ndip[d] = domain[nextDim];
2058 tempRLayouts_m[numSineTransforms_m] =
new Layout_t(ndip, serialParallel,
2061 tempRFields_m[numSineTransforms_m] =
2062 new RealField_t(*tempRLayouts_m[numSineTransforms_m]);
2064 if (!this->
compressTemps()) (*tempRFields_m[numSineTransforms_m]).Uncompress();
2067 size_t numComplex = nTransformDims - numSineTransforms_m;
2069 tempLayouts_m =
new Layout_t*[numComplex];
2072 for (dim=0; dim<numComplex; ++dim, ++icount) {
2074 while (!this->
transformDim(icount) || sineTransformDims_m[icount]) ++icount;
2077 ndip[0] = (*complexDomain_m)[icount];
2078 for (d=1; d<
Dim; ++d) {
2079 size_t nextDim = icount + d;
2080 if (nextDim >= Dim) nextDim -=
Dim;
2081 ndip[d] = (*complexDomain_m)[nextDim];
2088 if (!this->
compressTemps()) (*tempFields_m[dim]).Uncompress();
2096 tempRLayouts_m =
new Layout_t*[numSineTransforms_m];
2097 tempRFields_m =
new RealField_t*[numSineTransforms_m];
2099 for (dim=0; dim<numSineTransforms_m; ++dim) {
2103 ndip[0] = domain[activeDim];
2104 for (d=1; d<
Dim; ++d) {
2105 size_t nextDim = activeDim + d;
2106 if (nextDim >= Dim) nextDim -=
Dim;
2107 ndip[d] = domain[nextDim];
2112 tempRFields_m[dim] =
new RealField_t(*tempRLayouts_m[dim]);
2114 if (!this->
compressTemps()) (*tempRFields_m[dim]).Uncompress();
2126 template <
size_t Dim,
class T>
2137 if (nTransformDims > numSineTransforms_m) {
2138 for (d=0; d<numSineTransforms_m+1; ++d) {
2139 delete tempRFields_m[d];
2140 delete tempRLayouts_m[d];
2142 size_t numComplex = nTransformDims - numSineTransforms_m;
2143 for (d=0; d<numComplex; ++d) {
2144 delete tempFields_m[d];
2145 delete tempLayouts_m[d];
2147 delete [] tempFields_m;
2148 delete [] tempLayouts_m;
2151 for (d=0; d<numSineTransforms_m; ++d) {
2152 delete tempRFields_m[d];
2153 delete tempRLayouts_m[d];
2156 delete [] tempRFields_m;
2157 delete [] tempRLayouts_m;
2164 template <
size_t Dim,
class T>
2170 const bool& constInput)
2177 const Layout_t& in_layout = f.getLayout();
2178 const Domain_t& in_dom = in_layout.getDomain();
2179 const Layout_t& out_layout = g.getLayout();
2180 const Domain_t& out_dom = out_layout.getDomain();
2182 this->
checkDomain(*complexDomain_m,out_dom),
true );
2186 int icount, activeDim;
2190 PInsist(nTransformDims>numSineTransforms_m,
2191 "Wrong output Field type for real-to-real transform!!");
2196 RealField_t* tempR = &f;
2203 for (idim = 0; idim != numSineTransforms_m; ++idim, ++icount, ++activeDim) {
2206 while (!sineTransformDims_m[icount]) {
2213 bool skipTranspose =
false;
2216 if (idim == 0 && !constInput) {
2218 const Domain_t& first_dom = tempRLayouts_m[idim]->getDomain();
2221 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
2222 (in_dom[0].length() == first_dom[0].length()) &&
2223 (in_layout.getDistribution(0) ==
SERIAL) &&
2227 if (!skipTranspose) {
2229 (*tempRFields_m[idim])[tempRLayouts_m[idim]->
getDomain()] =
2230 (*tempR)[tempR->getLayout().getDomain()];
2234 tempR = tempRFields_m[idim];
2240 typename RealField_t::const_iterator_if l_i, l_end = tempR->end_if();
2241 for (l_i = tempR->begin_if(); l_i != l_end; ++l_i) {
2244 RealLField_t* ldf = (*l_i).second.get();
2248 localdataR = ldf->getP();
2251 int nstrips = 1, length = ldf->size(0);
2252 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2253 for (
int istrip=0; istrip<nstrips; ++istrip) {
2257 localdataR += length;
2268 while (!this->
transformDim(icount) || sineTransformDims_m[icount]) {
2269 if (sineTransformDims_m[icount]) ++activeDim;
2276 int last = numSineTransforms_m;
2277 (*tempRFields_m[last])[tempRLayouts_m[last]->
getDomain()] =
2278 (*tempR)[tempR->getLayout().getDomain()];
2282 tempR = tempRFields_m[last];
2286 ComplexField_t* temp = tempFields_m[0];
2288 int numComplex = nTransformDims-numSineTransforms_m;
2289 if (numComplex == 1) {
2290 bool skipTemp =
true;
2292 if ( !(out_layout == *tempLayouts_m[0]) ) skipTemp =
false;
2293 for (d=0; d<
Dim; ++d) {
2294 if ( out_layout.getDistribution(d) !=
2295 tempLayouts_m[0]->getDistribution(d) ) skipTemp =
false;
2297 if ( out_layout.numVnodes() != tempLayouts_m[0]->numVnodes() )
2301 if (skipTemp) temp = &g;
2307 typename RealField_t::const_iterator_if rl_i, rl_end = tempR->end_if();
2308 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
2309 for (rl_i = tempR->begin_if(); rl_i != rl_end; ++rl_i, ++cl_i) {
2311 RealLField_t* rldf = (*rl_i).second.get();
2312 ComplexLField_t* cldf = (*cl_i).second.get();
2317 T* localreal = rldf->getP();
2318 Complex_t* localcomp = cldf->getP();
2320 int nstrips = 1, lengthreal = rldf->size(0), lengthcomp = cldf->size(0);
2322 for (d=1; d<
Dim; ++d) nstrips *= rldf->size(d);
2323 for (
int istrip=0; istrip<nstrips; ++istrip) {
2325 for (
int ilen=0; ilen<lengthreal; ilen+=2)
2326 localcomp[ilen/2] = Complex_t(localreal[ilen],localreal[ilen+1]);
2331 localreal += lengthreal;
2332 localcomp += lengthcomp;
2340 Complex_t* localdata;
2345 for (idim = 1; idim != numComplex; ++idim, ++icount, ++activeDim) {
2348 while (!this->
transformDim(icount) || sineTransformDims_m[icount]) {
2349 if (sineTransformDims_m[icount]) ++activeDim;
2355 bool skipTranspose =
false;
2358 if (idim == numComplex-1) {
2360 const Domain_t& last_dom = tempLayouts_m[idim]->getDomain();
2363 skipTranspose = ( (out_dom[0].sameBase(last_dom[0])) &&
2364 (out_dom[0].length() == last_dom[0].length()) &&
2365 (out_layout.getDistribution(0) ==
SERIAL) &&
2369 if (!skipTranspose) {
2371 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
2372 (*temp)[temp->getLayout().getDomain()];
2376 temp = tempFields_m[idim];
2378 else if (idim == numComplex-1) {
2383 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
2393 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
2394 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
2397 ComplexLField_t* ldf = (*l_i).second.get();
2401 localdata = ldf->getP();
2404 int nstrips = 1, length = ldf->size(0);
2405 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2406 for (
int istrip=0; istrip<nstrips; ++istrip) {
2410 localdata += length;
2420 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
2435 template <
size_t Dim,
class T>
2441 const bool& constInput)
2448 const Layout_t& in_layout = f.getLayout();
2449 const Domain_t& in_dom = in_layout.getDomain();
2450 const Layout_t& out_layout = g.getLayout();
2451 const Domain_t& out_dom = out_layout.getDomain();
2457 int icount, activeDim;
2464 ComplexField_t* temp = &f;
2466 Complex_t* localdata;
2469 int numComplex = nTransformDims - numSineTransforms_m;
2471 activeDim = nTransformDims-1;
2472 for (idim = numComplex-1; idim != 0; --idim, --icount, --activeDim) {
2475 while (!this->
transformDim(icount) || sineTransformDims_m[icount]) {
2476 if (sineTransformDims_m[icount]) --activeDim;
2482 bool skipTranspose =
false;
2485 if (idim == numComplex-1 && !constInput) {
2487 const Domain_t& first_dom = tempLayouts_m[idim]->getDomain();
2490 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
2491 (in_dom[0].length() == first_dom[0].length()) &&
2492 (in_layout.getDistribution(0) ==
SERIAL) &&
2496 if (!skipTranspose) {
2498 (*tempFields_m[idim])[tempLayouts_m[idim]->
getDomain()] =
2499 (*temp)[temp->getLayout().getDomain()];
2503 temp = tempFields_m[idim];
2509 typename ComplexField_t::const_iterator_if l_i, l_end = temp->end_if();
2510 for (l_i = temp->begin_if(); l_i != l_end; ++l_i) {
2513 ComplexLField_t* ldf = (*l_i).second.get();
2517 localdata = ldf->getP();
2520 int nstrips = 1, length = ldf->size(0);
2521 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2522 for (
int istrip=0; istrip<nstrips; ++istrip) {
2526 localdata += length;
2535 while (!this->
transformDim(icount) || sineTransformDims_m[icount]) {
2536 if (sineTransformDims_m[icount]) --activeDim;
2542 RealField_t* tempR = tempRFields_m[numSineTransforms_m];
2544 bool skipTemp =
true;
2545 if (numComplex == 1 && !constInput) {
2549 if ( !(in_layout == *tempLayouts_m[0]) ) skipTemp =
false;
2550 for (d=0; d<
Dim; ++d) {
2551 if ( in_layout.getDistribution(d) !=
2552 tempLayouts_m[0]->getDistribution(d) ) skipTemp =
false;
2554 if ( in_layout.numVnodes() != tempLayouts_m[0]->numVnodes() )
2566 (*tempFields_m[0])[tempLayouts_m[0]->
getDomain()] =
2567 (*temp)[temp->getLayout().getDomain()];
2570 temp = tempFields_m[0];
2576 typename RealField_t::const_iterator_if rl_i, rl_end = tempR->end_if();
2577 typename ComplexField_t::const_iterator_if cl_i = temp->begin_if();
2578 for (rl_i = tempR->begin_if(); rl_i != rl_end; ++rl_i, ++cl_i) {
2580 RealLField_t* rldf = (*rl_i).second.get();
2581 ComplexLField_t* cldf = (*cl_i).second.get();
2586 T* localreal = rldf->getP();
2587 Complex_t* localcomp = cldf->getP();
2589 int nstrips = 1, lengthreal = rldf->size(0), lengthcomp = cldf->size(0);
2591 for (d=1; d<
Dim; ++d) nstrips *= rldf->size(d);
2592 for (
int istrip=0; istrip<nstrips; ++istrip) {
2597 for (
int ilen=0; ilen<lengthreal; ilen+=2) {
2598 localreal[ilen] =
real(localcomp[ilen/2]);
2599 localreal[ilen+1] =
imag(localcomp[ilen/2]);
2602 localreal += lengthreal;
2603 localcomp += lengthcomp;
2620 activeDim = nTransformDims - 1;
2621 for (idim = numSineTransforms_m-1; idim != -1;
2622 --idim, --icount, --activeDim) {
2625 while (!sineTransformDims_m[icount]) {
2632 bool skipTranspose =
false;
2637 const Domain_t& last_dom = tempRLayouts_m[idim]->getDomain();
2640 skipTranspose = ( (out_dom[0].sameBase(last_dom[0])) &&
2641 (out_dom[0].length() == last_dom[0].length()) &&
2642 (out_layout.getDistribution(0) ==
SERIAL) &&
2646 if (!skipTranspose) {
2648 (*tempRFields_m[idim])[tempRLayouts_m[idim]->
getDomain()] =
2649 (*tempR)[tempR->getLayout().getDomain()];
2653 tempR = tempRFields_m[idim];
2655 else if (idim == 0) {
2660 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2670 typename RealField_t::const_iterator_if l_i, l_end = tempR->end_if();
2671 for (l_i = tempR->begin_if(); l_i != l_end; ++l_i) {
2674 RealLField_t* ldf = (*l_i).second.get();
2678 localdataR = ldf->getP();
2681 int nstrips = 1, length = ldf->size(0);
2682 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2683 for (
int istrip=0; istrip<nstrips; ++istrip) {
2687 localdataR += length;
2697 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2712 template <
size_t Dim,
class T>
2718 const bool& constInput)
2725 const Layout_t& in_layout = f.getLayout();
2726 const Domain_t& in_dom = in_layout.getDomain();
2727 const Layout_t& out_layout = g.getLayout();
2728 const Domain_t& out_dom = out_layout.getDomain();
2738 PInsist(nTransformDims==numSineTransforms_m,
2739 "Wrong output Field type for real-to-complex transform!!");
2744 RealField_t* tempR = &f;
2749 begdim = (direction == +1) ? 0 : static_cast<int>(nTransformDims-1);
2750 enddim = (direction == +1) ? static_cast<int>(nTransformDims) : -1;
2751 for (idim = begdim; idim != enddim; idim+=direction) {
2755 bool skipTranspose =
false;
2758 if (idim == begdim && !constInput) {
2760 const Domain_t& first_dom = tempRLayouts_m[idim]->getDomain();
2763 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
2764 (in_dom[0].length() == first_dom[0].length()) &&
2765 (in_layout.getDistribution(0) ==
SERIAL) &&
2771 if (idim == enddim-direction) {
2773 const Domain_t& last_dom = tempRLayouts_m[idim]->getDomain();
2776 skipTranspose = ( (out_dom[0].sameBase(last_dom[0])) &&
2777 (out_dom[0].length() == last_dom[0].length()) &&
2778 (out_layout.getDistribution(0) ==
SERIAL) &&
2782 if (!skipTranspose) {
2784 (*tempRFields_m[idim])[tempRLayouts_m[idim]->
getDomain()] =
2785 (*tempR)[tempR->getLayout().getDomain()];
2789 tempR = tempRFields_m[idim];
2791 else if (idim == enddim-direction && tempR != &g) {
2796 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2806 typename RealField_t::const_iterator_if l_i, l_end = tempR->end_if();
2807 for (l_i = tempR->begin_if(); l_i != l_end; ++l_i) {
2810 RealLField_t* ldf = (*l_i).second.get();
2814 localdataR = ldf->getP();
2817 int nstrips = 1, length = ldf->size(0);
2818 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2819 for (
int istrip=0; istrip<nstrips; ++istrip) {
2823 localdataR += length;
2833 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2848 template <
size_t Dim,
class T>
2858 const Layout_t& in_layout = f.getLayout();
2859 const Domain_t& in_dom = in_layout.getDomain();
2868 PInsist(nTransformDims==numSineTransforms_m,
2869 "Cannot perform real-to-complex transform in-place!!");
2874 RealField_t* tempR = &f;
2879 begdim = (direction == +1) ? 0 : static_cast<int>(nTransformDims-1);
2880 enddim = (direction == +1) ? static_cast<int>(nTransformDims) : -1;
2881 for (idim = begdim; idim != enddim; idim+=direction) {
2885 bool skipTranspose =
false;
2888 if (idim == begdim) {
2890 const Domain_t& first_dom = tempRLayouts_m[idim]->getDomain();
2893 skipTranspose = ( (in_dom[0].sameBase(first_dom[0])) &&
2894 (in_dom[0].length() == first_dom[0].length()) &&
2895 (in_layout.getDistribution(0) ==
SERIAL) &&
2901 if (idim == enddim-direction) {
2903 const Domain_t& last_dom = tempRLayouts_m[idim]->getDomain();
2906 skipTranspose = ( (in_dom[0].sameBase(last_dom[0])) &&
2907 (in_dom[0].length() == last_dom[0].length()) &&
2908 (in_layout.getDistribution(0) ==
SERIAL) &&
2912 if (!skipTranspose) {
2914 (*tempRFields_m[idim])[tempRLayouts_m[idim]->
getDomain()] =
2915 (*tempR)[tempR->getLayout().getDomain()];
2919 tempR = tempRFields_m[idim];
2921 else if (idim == enddim-direction && tempR != &f) {
2926 f[in_dom] = (*tempR)[tempR->getLayout().getDomain()];
2936 typename RealField_t::const_iterator_if l_i, l_end = tempR->end_if();
2937 for (l_i = tempR->begin_if(); l_i != l_end; ++l_i) {
2940 RealLField_t* ldf = (*l_i).second.get();
2944 localdataR = ldf->getP();
2947 int nstrips = 1, length = ldf->size(0);
2948 for (d=1; d<
Dim; ++d) nstrips *= ldf->size(d);
2949 for (
int istrip=0; istrip<nstrips; ++istrip) {
2953 localdataR += length;
2963 f[in_dom] = (*tempR)[tempR->getLayout().getDomain()];
2988 const bool sineTransformDims[1U],
const bool& compressTemps)
2990 sineTransformDims, compressTemps)
2999 length = rdomain[0].length();
3005 normFact = 1.0 / (2.0 * (length + 1));
3021 const bool& compressTemps)
3031 length = rdomain[0].length();
3037 normFact = 1.0 / (2.0 * (length + 1));
3084 delete tempRFields_m;
3085 delete tempRLayouts_m;
3098 const bool& constInput)
3104 const Layout_t& in_layout = f.getLayout();
3105 const Domain_t& in_dom = in_layout.getDomain();
3106 const Layout_t& out_layout = g.getLayout();
3107 const Domain_t& out_dom = out_layout.getDomain();
3112 RealField_t* tempR = &f;
3120 const Domain_t& temp_dom = tempRLayouts_m->getDomain();
3121 bool skipTranspose =
false;
3127 skipTranspose = ( (in_dom[0].sameBase(temp_dom[0])) &&
3128 (in_dom[0].length() == temp_dom[0].length()) &&
3129 (in_layout.numVnodes() == 1) &&
3133 bool skipFinal =
false;
3139 skipFinal = ( (out_dom[0].sameBase(temp_dom[0])) &&
3140 (out_dom[0].length() == temp_dom[0].length()) &&
3141 (out_layout.numVnodes() == 1) &&
3144 if (!skipTranspose) {
3146 (*tempRFields_m) = (*tempR);
3147 tempR = tempRFields_m;
3164 typename RealField_t::const_iterator_if l_i = tempR->begin_if();
3165 if (l_i != tempR->end_if()) {
3168 RealLField_t* ldf = (*l_i).second.get();
3172 localdataR = ldf->getP();
3208 const Layout_t& in_layout = f.getLayout();
3209 const Domain_t& in_dom = in_layout.getDomain();
3213 RealField_t* tempR = &f;
3221 const Domain_t& temp_dom = tempRLayouts_m->getDomain();
3222 bool skipTranspose =
false;
3228 skipTranspose = ( (in_dom[0].sameBase(temp_dom[0])) &&
3229 (in_dom[0].length() == temp_dom[0].length()) &&
3230 (in_layout.numVnodes() == 1) &&
3233 bool skipFinal =
false;
3239 skipFinal = ( (in_dom[0].sameBase(temp_dom[0])) &&
3240 (in_dom[0].length() == temp_dom[0].length()) &&
3241 (in_layout.numVnodes() == 1) &&
3244 if (!skipTranspose) {
3246 (*tempRFields_m) = (*tempR);
3248 tempR = tempRFields_m;
3265 typename RealField_t::const_iterator_if l_i = tempR->begin_if();
3266 if (l_i != tempR->end_if()) {
3269 RealLField_t* ldf = (*l_i).second.get();
3273 localdataR = ldf->getP();
FFTBase< 1U, T >::Domain_t Domain_t
bool checkDomain(const Domain_t &dom1, const Domain_t &dom2) const
compare indexes of two domains
Precision_t & getNormFact(void)
get the FFT normalization factor
FLieGenerator< T, N > imag(const FLieGenerator< std::complex< T >, N > &)
Take imaginary part of a complex generator.
unsigned numTransformDims(void) const
query number of transform dimensions
InternalFFT_t & getEngine(void)
access the internal FFT Engine
const Domain_t & getDomain(void) const
get our domain
void callFFT(unsigned transformDim, int direction, Complex_t *data)
bool transformDim(unsigned d) const
query whether this dimension is to be transformed
FFTBase< 1U, T >::Domain_t Domain_t
bool compressTemps(void) const
do we compress temps?
FFTBase< 1U, T >::Domain_t Domain_t
unsigned activeDimension(unsigned d) const
get dimension number from list of transformed dimensions
void setup(unsigned numTransformDims, const int *transformTypes, const int *axisLengths)
ParticleSpatialLayout< double, 3, Mesh_t > Layout_t
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.