36 #define SWAP(a,b) tempr=(a); (a)=(b); (b)=tempr
37 #define TWOPI 6.28318530717959
51 unsigned int dimCount = nn[idim];
52 if (!dimCount || (dimCount & (dimCount - 1)))
55 <<
"number of elements in direction " << idim
56 <<
" is not a power of 2" <<
endl
57 <<
" Number of elements in each direction = " << nn
64 label i1, i2, i3, i2rev, i3rev, ip1, ip2, ip3, ifp1, ifp2;
65 label ibit, k1, k2,
n, nprev, nrem, idim;
67 scalar theta, wi, wpi, wpr, wr, wtemp;
68 scalar*
data =
reinterpret_cast<scalar*
>(field.begin()) - 1;
73 if (isign == REVERSE_TRANSFORM)
88 for (idim=ndim; idim>=1; idim--)
91 nrem = ntot/(
n*nprev);
97 for (i2=1; i2<=ip2; i2+=ip1)
101 for (i1=i2; i1<=i2 + ip1 - 2; i1+=2)
103 for (i3=i1; i3<=ip3; i3+=ip2)
105 i3rev = i2rev + i3 - i2;
113 while (ibit >= ip1 && i2rev > ibit)
127 theta = isign*
TWOPI/(ifp2/ip1);
128 wtemp =
sin(0.5*theta);
129 wpr = -2.0*wtemp*wtemp;
134 for (i3 = 1; i3 <= ifp1; i3 += ip1)
136 for (i1 = i3; i1 <= i3 + ip1 - 2; i1 += 2)
138 for (i2 = i1; i2 <= ip3; i2 += ifp2)
142 tempr = scalar(wr*
data[k2]) - scalar(wi*
data[k2 + 1]);
143 tempi = scalar(wr*
data[k2 + 1]) + scalar(wi*
data[k2]);
145 data[k2 + 1] =
data[k1 + 1] - tempi;
147 data[k1 + 1] += tempi;
151 wr = (wtemp = wr)*wpr - wi*wpi + wr;
152 wi = wi*wpr + wtemp*wpi + wi;
162 if (isign == FORWARD_TRANSFORM)
170 scalar recRootN = 1.0/
sqrt(scalar(ntot));
174 field[i] *= recRootN;
194 transform(tfftField(), nn, FORWARD_TRANSFORM);
210 transform(tifftField(), nn, REVERSE_TRANSFORM);
234 tfftVectorField().replace
237 forwardTransform(tfield().
component(cmpt), nn)
243 return tfftVectorField;
263 tifftVectorField().replace
266 reverseTransform(tfield().
component(cmpt), nn)
272 return tifftVectorField;