我正在尝试使用C语言和库FFTW3对称为Exponential Time Differencing的PDE应用集成算法。无需过多讨论,我需要计算非线性项的FT,它是函数平方的导数:
我的操作方式如下:
1)定义晶格大小
int Nx = 500;
double dx = 0.2;
2)计算波矢
for ( i = 0; i < Nx/2+1; i++ ) {
qx[i] = 2.0*i*pi/(Nx*dx);
}
3)执行FFTW3计划以从初始条件获得h的FT(代码中未显示IC)
plan_forward = fftw_plan_dft_r2c_1d (Nx,dh,dhft,FFTW_ESTIMATE); //dh -> dhft
fftw_execute (plan_forward);
4)计算h的导数FT
for ( i = 0; i < Nx/2+1; i++ ) {
// dxhft[i][0] are the real parts and dxhft[i][1] are the imaginary
dxhft[i][0] = -qx[i] * dhft[i][1]; // Re[FTdxh] = -q Im[FTh]
dxhft[i][1] = qx[i] * dhft[i][0]; // Im[FTdxh] = q Re[FTh]
}
5)将Nyquist元素设置为0(如here所述)
dxhft[Nx/2][0] = 0.0;
dxhft[Nx/2][1] = 0.0;
6)使用逆傅立叶变换在真实空间中变换导数
plan_backward = fftw_plan_dft_c2r_1d (Nx,dxhft,dxh,FFTW_ESTIMATE); //dxhft -> dxh
fftw_execute (plan_backward);
7)用Nx归一化导数并计算非线性项
for ( i = 0; i < Nx; i++ ) {
dxh[i] = dxh[i] / (double) (Nx);
Nonl[i] = dxh[i]*dxh[i];
}
8)变换非线性项
fftw_execute_dft_r2c (plan_forward,Nonl,Nonlft); // Nonl -> Nonlft
好的。现在,我有理由相信q = 0的非线性项FT(即元素Nonlft[0][0]
和Nonlft[0][1]
)是错误的。但是我不明白代码中缺少什么。谁能给我一些关于这个问题的见识?