我有一个 FFT 过程fftconvx
,它采用两个张量Ttnsr
和S
作为输入参数并将结果生成到另一个张量G
中。所有张量都定义为 Blitz++ 数组Array<complex<double>, N>
,其中N
是数组的秩。该过程fftconvx
必须在双循环内多次调用。
理想情况下,我想传递子数组Stnsr(ri,rj,rk,0)
或Stnsr(ri,rj,rk,1)
将结果接收到子数组中Gtnsr(t,p,ri,rj,rk,0)
或Gtnsr(t,p,ri,rj,rk,1)
如下所示:
fftconvx( Gtnsr(t,p,ri,rj,rk,0), Ttnsr, Stnsr(ri,rj,rk,0) );
变量ri,rj,rk
是 Blitz++ 数组范围。不幸的是,这不起作用并导致以下编译错误:
error: invalid initialization of non-const reference of type
‘blitz::Array<std::complex<double>, 3>&’ from an rvalue of type
‘blitz::SliceInfo<std::complex<double>, int, int, blitz::Range, blitz::Range,
blitz::Range, int, blitz::nilArraySection, blitz::nilArraySection,
blitz::nilArraySection, blitz::nilArraySection, blitz::nilArraySection>::T_slice
{aka blitz::Array<std::complex<double>, 3>}’
fftconvx(Gtnsr(t,p,ri,rj,rk,0), Ttnsr, Stnsr(ri,rj,rk,0));
的签名fftconvx
是:
void fftconvx(Array<complex<double>, 3> &c,
Array<complex<double>, 3> x2,
Array<complex<double>, 3> x1,
...);
有更多的数组和变量作为输入参数传递,但为简洁起见,我省略了它们。
到目前为止,我已经提出了基于临时数组的解决方案,S
并且G
:
S(ri,rj,rk) = Stnsr(ri,rj,rk,0);
fftconvx(G, Ttnsr, S);
Gtnsr(t,p,ri,rj,rk,0) = G(ri,rj,rk);
我相信有一个更优雅的解决方案。