使用FFTW3和q = 0的非线性项的FT

时间:2018-10-19 14:51:01

标签: c fft fftw derivative nonlinear-functions

我正在尝试使用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])是错误的。但是我不明白代码中缺少什么。谁能给我一些关于这个问题的见识?

0 个答案:

没有答案