如何传递Blitz++子数组作为过程的输入/输出参数

How to pass Blitz++ subarray as an input/output parameter of a procedure

本文关键字:输入 输出 参数 过程 Blitz++ 何传递 数组      更新时间:2023-10-16

我有一个FFT过程fftconvx,将两个张量TtnsrS作为输入参数,并将结果生成到另一个张量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,
              ...);

还有更多的数组和变量作为输入参数传递,但为了简洁起见,我省略了它们。

到目前为止,我已经提出了基于临时阵列SG:的解决方案

S(ri,rj,rk) = Stnsr(ri,rj,rk,0);
fftconvx(G, Ttnsr, S);
Gtnsr(t,p,ri,rj,rk,0) = G(ri,rj,rk);

我相信还有一个更优雅的解决方案。

在不知道Blitz++的情况下,我提供了这种可能的解决方案。

看起来Gtnsr是SliceInfo而不是Array,但它有一个运算符Array。

因此将fftconvx更改为

template<class SliceOrArray>
void fftconvx(SliceOrArray &c,
              const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...);

如果fftconvx中的操作允许使用切片,则可能会起作用。

如果将Blitz++操作为C++11,则以下内容可能也适用。

G fftconvx(   const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...) {
    G c;
    ...
    return c; // C++11 NRVO
};

然后调用

Gtnsr(t,p,ri,rj,rk,0) = fftconvx( ... );