29 template <
size_t Dim,
class T>
32 const bool transformTheseDims[
Dim],
33 const bool& compressTemps)
35 transformTheseDims, compressTemps)
39 size_t nTransformDims = this->numTransformDims();
40 int* lengths =
new int[nTransformDims];
42 for (d=0; d<nTransformDims; ++d)
43 lengths[d] = cdomain[this->activeDimension(d)].length();
46 int* transformTypes =
new int[nTransformDims];
47 T& normFact = this->getNormFact();
49 for (d=0; d<nTransformDims; ++d) {
51 normFact /= lengths[d];
55 this->getEngine().setup(nTransformDims, transformTypes, lengths);
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>
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>
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>
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>
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();
ParticleSpatialLayout< double, 3, Mesh_t > Layout_t
FLieGenerator< T, N > imag(const FLieGenerator< std::complex< T >, N > &)
Take imaginary part of a complex generator.
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
FFTBase< 1U, T >::Domain_t Domain_t
FFTBase< 1U, T >::Domain_t Domain_t
FFTBase< 1U, T >::Domain_t Domain_t
InternalFFT_t & getEngine(void)
access the internal FFT Engine
unsigned numTransformDims(void) const
query number of transform dimensions
const Domain_t & getDomain(void) const
get our domain
Precision_t & getNormFact(void)
get the FFT normalization factor
bool transformDim(unsigned d) const
query whether this dimension is to be transformed
bool compressTemps(void) const
do we compress temps?
unsigned activeDimension(unsigned d) const
get dimension number from list of transformed dimensions
bool checkDomain(const Domain_t &dom1, const Domain_t &dom2) const
compare indexes of two domains
void callFFT(unsigned transformDim, int direction, Complex_t *data)
void setup(unsigned numTransformDims, const int *transformTypes, const int *axisLengths)