29template <
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;
67template <
size_t Dim,
class T>
79 serialParallel[0] =
SERIAL;
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();
116template <
size_t Dim,
class T>
129 for (
size_t d=0; d<nTransformDims; ++d) {
142template <
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();
158 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
159 this->checkDomain(this->getDomain(),out_dom),
true);
165 size_t nTransformDims = this->numTransformDims();
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) {
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) {
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()];
211 if (this->compressTemps() && temp != &f) *temp = 0;
212 temp = tempFields_m[idim];
214 else if (idim == enddim-direction && temp != &g) {
219 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
222 if (this->compressTemps() && temp != &f) *temp = 0;
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) {
242 this->getEngine().callFFT(idim, direction, localdata);
254 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
255 if (this->compressTemps() && temp != &f) *temp = 0;
261 g *= Complex_t(this->getNormFact(), 0.0);
266template <
size_t Dim,
class T>
277 const Layout_t& in_layout = f.getLayout();
278 const Domain_t& in_dom = in_layout.getDomain();
279 PAssert_EQ(this->checkDomain(this->getDomain(),in_dom),
true);
285 size_t nTransformDims = this->numTransformDims();
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) {
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) {
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()];
331 if (this->compressTemps() && temp != &f) *temp = 0;
332 temp = tempFields_m[idim];
334 else if (idim == enddim-direction && temp != &f) {
339 f[in_dom] = (*temp)[temp->getLayout().getDomain()];
342 if (this->compressTemps()) *temp = 0;
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) {
362 this->getEngine().callFFT(idim, direction, localdata);
375 f[in_dom] = (*temp)[temp->getLayout().getDomain()];
376 if (this->compressTemps()) *temp = 0;
382 f *= Complex_t(this->getNormFact(), 0.0);
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;
507 const bool& constInput)
514 const Layout_t& in_layout = f.getLayout();
515 const Domain_t& in_dom = in_layout.getDomain();
517 const Domain_t& out_dom = out_layout.getDomain();
518 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
519 this->checkDomain(this->getDomain(),out_dom),
true);
522 ComplexField_t* temp = &f;
524 Complex_t* localdata;
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);
568 if (this->compressTemps() && temp != &f) *temp = 0;
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();
586 this->getEngine().callFFT(0, direction, localdata);
596 if (this->compressTemps() && temp != &f) *temp = 0;
602 g *= Complex_t(this->getNormFact(), 0.0);
622 const Layout_t& in_layout = f.getLayout();
623 const Domain_t& in_dom = in_layout.getDomain();
624 PAssert_EQ(this->checkDomain(this->getDomain(),in_dom),
true);
627 ComplexField_t* temp = &f;
629 Complex_t* localdata;
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();
668 this->getEngine().callFFT(0, direction, localdata);
678 if (this->compressTemps()) *temp = 0;
684 f *= Complex_t(this->getNormFact(), 0.0);
702template <
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;
743template <
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];
783template <
size_t Dim,
class T>
795 size_t d, d2, activeDim;
804 for (d=0; d <
Dim; ++d) {
813 for (d=0; d<
Dim; ++d) {
814 if (d == activeDim) {
817 (domain[d].length()/2 + 1) ) match =
false;
825 "Domains provided for real and complex Fields are incompatible!");
836 ndip[0] = domain[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];
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)
900 tmporder[0] = fftorder[0];
902 fftorder[d] = fftorder[d+1];
909 for (d=0; d <
Dim; ++d)
910 tmporder[d] = fftorder[d];
911 for (d=0; d <
Dim; ++d)
921template <
size_t Dim,
class T>
929 for (
size_t d=0; d<nTransformDims; ++d) {
940template <
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();
955 const Domain_t& out_dom = out_layout.getDomain();
958 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
959 this->checkDomain(complexDomain_m,out_dom),
true);
964 size_t nTransformDims = this->numTransformDims();
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]);
1070 this->getEngine().callFFT(idim, +1, localcomp);
1073 localreal += lengthreal;
1074 localcomp += lengthcomp;
1080 if (this->compressTemps() && tempR != &f)
1086 Complex_t* localdata;
1089 for (idim = 1; idim < nTransformDims; ++idim) {
1091 bool skipTranspose =
false;
1095 if (idim == nTransformDims-1) {
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()];
1114 if (this->compressTemps())
1116 temp = tempFields_m[idim];
1118 }
else if (idim == nTransformDims-1) {
1124 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
1127 if (this->compressTemps())
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) {
1153 this->getEngine().callFFT(idim, +1, localdata);
1156 localdata += length;
1168 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
1170 if (this->compressTemps()) *temp = 0;
1175 if (direction == +1) g = g * this->getNormFact();
1186template <
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();
1201 const Domain_t& out_dom = out_layout.getDomain();
1202 PAssert_EQ( this->checkDomain(complexDomain_m,in_dom) &&
1203 this->checkDomain(this->getDomain(),out_dom),
true);
1208 size_t nTransformDims = this->numTransformDims();
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) {
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()];
1243 if (this->compressTemps() && temp != &f)
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) {
1269 this->getEngine().callFFT(idim, -1, localdata);
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()];
1337 if (this->compressTemps() && temp != &f)
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) {
1366 this->getEngine().callFFT(idim, -1, localcomp);
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;
1381 if (this->compressTemps() && temp != &f)
1389 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
1391 if (this->compressTemps())
1397 if (direction == +1) g = g * this->getNormFact();
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;
1492 (domain[0].length()/2 + 1) ) match =
false;
1494 "Domains provided for real and complex Fields are incompatible!");
1501 if (!this->compressTemps()) this->tempRField_m->Uncompress();
1508 if (!this->compressTemps()) this->
tempFields_m->Uncompress();
1528 delete this->tempRField_m;
1542 const bool& constInput)
1549 const Layout_t& in_layout = f.getLayout();
1550 const Domain_t& in_dom = in_layout.getDomain();
1552 const Domain_t& out_dom = out_layout.getDomain();
1553 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
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]);
1614 this->getEngine().callFFT(0, +1, localcomp);
1620 if (this->compressTemps() && tempR != &f) *tempR = 0;
1628 if (this->compressTemps()) *temp = 0;
1633 if (direction == +1) g = g * this->getNormFact();
1648 const bool& constInput)
1655 const Layout_t& in_layout = f.getLayout();
1656 const Domain_t& in_dom = in_layout.getDomain();
1658 const Domain_t& out_dom = out_layout.getDomain();
1659 PAssert_EQ( this->checkDomain(complexDomain_m,in_dom) &&
1660 this->checkDomain(this->getDomain(),out_dom),
true);
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);
1703 if (this->compressTemps() && temp != &f) *temp = 0;
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);
1726 this->getEngine().callFFT(0, -1, localcomp);
1728 for (
int ilen=0; ilen<lengthreal; ilen+=2) {
1729 localreal[ilen] =
real(localcomp[ilen/2]);
1730 localreal[ilen+1] =
imag(localcomp[ilen/2]);
1737 if (this->compressTemps() && temp != &f) *temp = 0;
1745 if (this->compressTemps()) *tempR = 0;
1750 if (direction == +1) g = g * this->getNormFact();
1768template <
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;
1830template <
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];
1885template <
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;
1930template <
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));
1971template <
size_t Dim,
class T>
1980 size_t d, dim, activeDim = 0;
1989 serialParallel[0] =
SERIAL;
1991 for (d=1; d<
Dim; ++d)
2001 while (d<
Dim && !match) {
2010 for (d=0; d<
Dim; ++d) {
2011 if (d == activeDim) {
2014 (domain[d].length()/2 + 1) ) match =
false;
2019 domain[d].length() ) match =
false;
2023 "Domains provided for real and complex Fields are incompatible!");
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];
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];
2072 for (dim=0; dim<numComplex; ++dim, ++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();
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];
2114 if (!this->compressTemps()) (*
tempRFields_m[dim]).Uncompress();
2126template <
size_t Dim,
class T>
2143 for (d=0; d<numComplex; ++d) {
2164template <
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();
2180 const Domain_t& out_dom = out_layout.getDomain();
2181 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
2182 this->checkDomain(*complexDomain_m,out_dom),
true );
2186 int icount, activeDim;
2188 size_t nTransformDims = this->numTransformDims();
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]) {
2207 if (this->transformDim(icount)) ++activeDim;
2213 bool skipTranspose =
false;
2216 if (idim == 0 && !constInput) {
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()];
2233 if (this->compressTemps() && tempR != &f) *tempR = 0;
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) {
2255 this->getEngine().callFFT(activeDim, direction, localdataR);
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()];
2281 if (this->compressTemps() && tempR != &f) *tempR = 0;
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]);
2329 this->getEngine().callFFT(activeDim, +1, localcomp);
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) {
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()];
2375 if (this->compressTemps()) *temp = 0;
2376 temp = tempFields_m[idim];
2378 else if (idim == numComplex-1) {
2383 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
2386 if (this->compressTemps()) *temp = 0;
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) {
2408 this->getEngine().callFFT(activeDim, direction, localdata);
2410 localdata += length;
2420 g[out_dom] = (*temp)[temp->getLayout().getDomain()];
2421 if (this->compressTemps()) *temp = 0;
2426 if (direction == +1) g = g * this->getNormFact();
2435template <
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();
2451 const Domain_t& out_dom = out_layout.getDomain();
2452 PAssert_EQ( this->checkDomain(*complexDomain_m,in_dom) &&
2453 this->checkDomain(this->getDomain(),out_dom),
true );
2457 int icount, activeDim;
2459 size_t nTransformDims = this->numTransformDims();
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) {
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()];
2502 if (this->compressTemps() && temp != &f) *temp = 0;
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) {
2524 this->getEngine().callFFT(activeDim, direction, localdata);
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()];
2569 if (this->compressTemps() && temp != &f) *temp = 0;
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) {
2595 this->getEngine().callFFT(activeDim, -1, localcomp);
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;
2610 if (this->compressTemps() && temp != &f) *temp = 0;
2620 activeDim = nTransformDims - 1;
2621 for (idim = numSineTransforms_m-1; idim != -1;
2622 --idim, --icount, --activeDim) {
2625 while (!sineTransformDims_m[icount]) {
2626 if (this->transformDim(icount)) --activeDim;
2632 bool skipTranspose =
false;
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()];
2652 if (this->compressTemps()) *tempR = 0;
2653 tempR = tempRFields_m[idim];
2655 else if (idim == 0) {
2660 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2663 if (this->compressTemps()) *tempR = 0;
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) {
2685 this->getEngine().callFFT(activeDim, direction, localdataR);
2687 localdataR += length;
2697 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2698 if (this->compressTemps()) *tempR = 0;
2703 if (direction == +1) g = g * this->getNormFact();
2712template <
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();
2728 const Domain_t& out_dom = out_layout.getDomain();
2729 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
2730 this->checkDomain(this->getDomain(),out_dom),
true );
2736 size_t nTransformDims = this->numTransformDims();
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) {
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) {
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()];
2788 if (this->compressTemps() && tempR != &f) *tempR = 0;
2789 tempR = tempRFields_m[idim];
2791 else if (idim == enddim-direction && tempR != &g) {
2796 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2799 if (this->compressTemps() && tempR != &f) *tempR = 0;
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) {
2821 this->getEngine().callFFT(idim, direction, localdataR);
2823 localdataR += length;
2833 g[out_dom] = (*tempR)[tempR->getLayout().getDomain()];
2834 if (this->compressTemps() && tempR != &f) *tempR = 0;
2839 if (direction == +1) g = g * this->getNormFact();
2848template <
size_t Dim,
class T>
2858 const Layout_t& in_layout = f.getLayout();
2859 const Domain_t& in_dom = in_layout.getDomain();
2860 PAssert_EQ(this->checkDomain(this->getDomain(),in_dom),
true);
2866 size_t nTransformDims = this->numTransformDims();
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) {
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) {
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()];
2918 if (this->compressTemps() && tempR != &f) *tempR = 0;
2919 tempR = tempRFields_m[idim];
2921 else if (idim == enddim-direction && tempR != &f) {
2926 f[in_dom] = (*tempR)[tempR->getLayout().getDomain()];
2929 if (this->compressTemps() && tempR != &f) *tempR = 0;
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) {
2951 this->getEngine().callFFT(idim, direction, localdataR);
2953 localdataR += length;
2963 f[in_dom] = (*tempR)[tempR->getLayout().getDomain()];
2964 if (this->compressTemps()) *tempR = 0;
2969 if (direction == +1) f = f * this->getNormFact();
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));
3098 const bool& constInput)
3104 const Layout_t& in_layout = f.getLayout();
3105 const Domain_t& in_dom = in_layout.getDomain();
3107 const Domain_t& out_dom = out_layout.getDomain();
3108 PAssert_EQ( this->checkDomain(this->getDomain(),in_dom) &&
3109 this->checkDomain(this->getDomain(),out_dom),
true);
3112 RealField_t* tempR = &f;
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;
3157 if (this->compressTemps() && tempR != &f) *tempR = 0;
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();
3175 this->getEngine().callFFT(0, direction, localdataR);
3184 if (this->compressTemps() && tempR != &f) *tempR = 0;
3189 if (direction == +1) g = g * this->getNormFact();
3208 const Layout_t& in_layout = f.getLayout();
3209 const Domain_t& in_dom = in_layout.getDomain();
3210 PAssert_EQ(this->checkDomain(this->getDomain(),in_dom),
true);
3213 RealField_t* tempR = &f;
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;
3258 if (this->compressTemps() && tempR != &f) *tempR = 0;
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();
3276 this->getEngine().callFFT(0, direction, localdataR);
3285 if (this->compressTemps()) *tempR = 0;
3290 if (direction == +1) f = f * this->getNormFact();
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
FLieGenerator< T, N > imag(const FLieGenerator< std::complex< T >, N > &)
Take imaginary part of a complex generator.
ParticleSpatialLayout< double, 3, Mesh_t > Layout_t
BareField< Complex_t, Dim > ComplexField_t
FFTBase< Dim, T >::Domain_t Domain_t
FieldLayout< Dim > Layout_t
FFT(const Domain_t &cdomain, const bool transformTheseDims[Dim], const bool &compressTemps=false)
Layout_t ** tempLayouts_m
ComplexField_t ** tempFields_m
FFTBase< 1U, T >::Domain_t Domain_t
FFT(const Domain_t &cdomain, const bool transformTheseDims[1U], const bool &compressTemps=false)
BareField< Complex_t, 1U > ComplexField_t
ComplexField_t * tempFields_m
BareField< Complex_t, Dim > ComplexField_t
ComplexField_t ** tempFields_m
FFTBase< Dim, T >::Domain_t Domain_t
RealField_t * tempRField_m
Layout_t ** tempLayouts_m
FieldLayout< Dim > Layout_t
BareField< T, Dim > RealField_t
FFT(const Domain_t &rdomain, const Domain_t &cdomain, const bool transformTheseDims[Dim], const bool &compressTemps=false)
FFTBase< 1U, T >::Domain_t Domain_t
BareField< T, 1U > RealField_t
FFT(const Domain_t &rdomain, const Domain_t &cdomain, const bool transformTheseDims[1U], const bool &compressTemps=false)
BareField< Complex_t, 1U > ComplexField_t
ComplexField_t * tempFields_m
BareField< T, Dim > RealField_t
ComplexField_t ** tempFields_m
const Domain_t * complexDomain_m
Layout_t ** tempRLayouts_m
Layout_t ** tempLayouts_m
FFT(const Domain_t &rdomain, const Domain_t &cdomain, const bool transformTheseDims[Dim], const bool sineTransformDims[Dim], const bool &compressTemps=false)
BareField< Complex_t, Dim > ComplexField_t
RealField_t ** tempRFields_m
FFTBase< Dim, T >::Domain_t Domain_t
bool sineTransformDims_m[Dim]
size_t numSineTransforms_m
FieldLayout< Dim > Layout_t
Layout_t * tempRLayouts_m
FFT(const Domain_t &rdomain, const bool sineTransformDims[1U], const bool &compressTemps=false)
RealField_t * tempRFields_m
FFTBase< 1U, T >::Domain_t Domain_t
BareField< T, 1U > RealField_t
Precision_t & getNormFact(void)
get the FFT normalization factor
const Domain_t & getDomain(void) const
unsigned numTransformDims(void) const
static GuardCellSizes< Dim > nullGC
null GuardCellSizes object for checking BareField arguments to transform
bool transformDim(unsigned d) const
unsigned activeDimension(unsigned d) const
InternalFFT_t & getEngine(void)
access the internal FFT Engine
void setup(unsigned numTransformDims, const int *transformTypes, const int *axisLengths)
RegionLayout< T, Dim, Mesh > & getLayout()