FFTW3在传统Fortran中的调用指南

FFTW3在传统Fortran中的调用指南

fftw3 DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.) fftw3 项目地址: https://gitcode.com/gh_mirrors/ff/fftw3

前言

FFTW(Fastest Fourier Transform in the West)是一个广泛使用的高性能傅里叶变换库。虽然它主要用C语言编写,但也提供了Fortran接口。本文将详细介绍如何在传统Fortran(不支持Fortran 2003 C互操作性特性的老版本)中调用FFTW3。

传统Fortran接口概述

传统Fortran接口与C接口的主要区别在于:

  1. 前缀不同(双精度版本使用dfftw_而非fftw_)
  2. 函数返回值变为子程序的第一个参数
  3. 多维数组使用列优先(column-major)顺序
  4. 缺乏类型检查,需要开发者更谨慎

接口命名规则

FFTW为不同精度提供了不同的前缀:

  • 双精度:dfftw_
  • 单精度:sfftw_
  • 长双精度:lfftw_
  • 四精度(某些系统支持):fftwq_

重要注意事项

计划(plan)变量

在Fortran中,plan变量必须声明为足够大的类型以存储指针。推荐使用integer*8以确保兼容性。

数组顺序

Fortran接口会自动将多维数组视为列优先顺序,这是通过反转传递给FFTW的维度顺序实现的。这对多维实数-复数变换有重要影响。

对齐问题

传统Fortran无法使用fftw_malloc进行动态内存分配。如果需要SIMD优化,开发者需要自行确保数组至少16字节对齐。

常量定义

FFTW的常量(如FFTW_MEASUREFFTW_ESTIMATE)在Fortran中通过fftw3.f文件定义。开发者可以:

  1. 使用预处理包含该文件
  2. 直接复制内容到代码中

在Fortran中组合不同标志时,使用+运算符而非C中的|

执行变换

在C中通常使用fftw_execute执行计划,但在Fortran中更安全的方式是使用显式指定输入输出数组的函数:

call dfftw_execute_dft(plan, in, out)

注意事项:

  1. 必须使用与创建计划时匹配的执行函数类型
  2. 通常应传递与创建计划时相同的数组
  3. 如果使用不同数组,必须满足对齐要求

示例代码

一维复数变换

double complex in, out
dimension in(N), out(N)
integer*8 plan

call dfftw_plan_dft_1d(plan,N,in,out,FFTW_FORWARD,FFTW_ESTIMATE)
call dfftw_execute_dft(plan, in, out)
call dfftw_destroy_plan(plan)

多线程支持

integer iret
call dfftw_init_threads(iret)
call dfftw_plan_with_nthreads(8)

三维数组原地变换

double complex arr
dimension arr(L,M,N)
integer*8 plan

call dfftw_plan_dft_3d(plan, L,M,N, arr,arr, FFTW_FORWARD, FFTW_ESTIMATE)
call dfftw_execute_dft(plan, arr, arr)
call dfftw_destroy_plan(plan)

实数变换注意事项

对于实数变换,复数输出数组的第一个维度会被减半(与C中最后一个维度减半不同),这是Fortran列优先顺序的结果。

Wisdom机制

Wisdom是FFTW保存计划优化信息的机制。在Fortran中可以使用以下函数:

  • dfftw_import_system_wisdom
  • dfftw_import_wisdom
  • dfftw_export_wisdom
  • dfftw_forget_wisdom

示例:导入系统wisdom

integer isuccess
call dfftw_import_system_wisdom(isuccess)

总结

虽然传统Fortran接口不如现代Fortran接口类型安全,但在谨慎使用的情况下仍能提供FFTW的强大功能。开发者需要特别注意数组顺序、对齐和函数匹配等问题。通过遵循本文指南,开发者可以在传统Fortran项目中高效利用FFTW进行傅里叶变换计算。

fftw3 DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.) fftw3 项目地址: https://gitcode.com/gh_mirrors/ff/fftw3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌榕萱Kelsey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值