如何将FFTW用于反周期边界条件的格点规范理论计算?
完全可以用FFTW(包括其并行MPI实现)高效处理反周期边界条件下的三维拉普拉斯格林函数计算,远优于自行编写的傅里叶变换代码。以下是具体实现思路和关键步骤:
核心原理:反周期DFT与标准DFT的转换
反周期边界条件(( A(x+L) = -A(x) ))对应的动量集合( k_\mu = \frac{\pi}{L}(2k+1) ),本质是半整数格点的周期性动量。通过简单的相位预处理,就能将反周期问题转化为标准周期性DFT问题,直接复用FFTW的高度优化实现:
预处理输入场:对三维格点( x=(x_1,x_2,x_3) )(每个维度( 0 \leq x_i < L )),将光子场( A_\mu(x) )乘以相位因子:
const int phase = ((x1 + x2 + x3) % 2 == 0) ? 1 : -1; A_prime[x] = A[x] * phase;此时( A' )满足周期性边界条件,可直接用FFTW计算标准3D DFT。
动量空间映射:FFTW输出的标准DFT结果对应周期性动量( p_\mu = \frac{2\pi}{L}n )(( n=0,1,...,L-1 )),只需将其映射为反周期动量:
k_mu = M_PI / L * (2 * n + 1);(此处( n )与原问题中( k )的索引直接对应,无需额外调整FFTW的输出索引)
拉普拉斯格林函数的计算流程
并行DFT规划:使用FFTW的MPI接口创建3D DFT/IDFT规划,例如:
// 假设使用复数场,分布式存储 fftw_mpi_plan plan_forward = fftw_mpi_plan_dft_3d( L, L, L, A_prime, A_hat, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_MEASURE ); fftw_mpi_plan plan_backward = fftw_mpi_plan_dft_3d( L, L, L, A_hat_green, A_green, MPI_COMM_WORLD, FFTW_BACKWARD, FFTW_MEASURE );用
FFTW_MEASURE或FFTW_PATIENT模式生成最优规划(首次运行会耗时,但后续重复调用效率极高)。正向DFT:执行预处理后的场的正向DFT,得到动量空间的( \hat{A}_\mu(k) )。
动量空间格林函数卷积:对每个反周期动量( k ),计算格林函数与( \hat{A}_\mu(k) )的乘积:
double k_sq = k_x*k_x + k_y*k_y + k_z*k_z; A_hat_green[k] = -A_hat[k] / k_sq;(反周期边界下所有( k )的模长平方非零,无红外发散问题)
逆DFT:对卷积后的动量空间结果执行逆DFT,再乘以相位因子( (-1)^{x_1+x_2+x_3} ),得到实空间的格林函数结果。
性能优化要点
- 复用FFTW规划:固定格点尺寸时,一次规划可多次使用,避免重复开销。
- 利用分布式存储:FFTW MPI会自动将三维数据分配到各进程,无需手动拆分。
- 选择合适精度:根据计算需求选择单/双精度,单精度可进一步提升计算速度。
内容的提问来源于stack exchange,提问作者Peter

