У меня процедура 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);
Я считаю, что есть более элегантное решение.
Не зная 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( ... );