Nearly all of the FFTW functions have Fortran-callable equivalents.
The name of the legacy Fortran routine is the same as that of the
corresponding C routine, but with the ‘fftw_’ prefix replaced by
‘dfftw_’.9 The single and long-double precision
versions use ‘sfftw_’ and ‘lfftw_’, respectively, instead of
‘fftwf_’ and ‘fftwl_’; quadruple precision (
is available on some systems as ‘fftwq_’ (see Precision).
long double on x86 hardware is usually at most
80-bit extended precision, not quadruple precision.)
For the most part, all of the arguments to the functions are the same, with the following exceptions:
planvariables (what would be of type
fftw_planin C), must be declared as a type that is at least as big as a pointer (address) on your machine. We recommend using
integer*8everywhere, since this should always be big enough.
fftw_plan_dft) is converted into a subroutine. The return value is converted into an additional first parameter of this subroutine.10
fftw_mallocdynamic-allocation routine. If you want to exploit the SIMD FFTW (see SIMD alignment and fftw_malloc), you’ll need to figure out some other way to ensure that your arrays are at least 16-byte aligned.
fftw_iodimstructure from the guru interface (see Guru vector and transform sizes) must be split into separate arguments. In particular, any
fftw_iodimarray arguments in the C guru interface become three integer array arguments (
os) in the Fortran guru interface, all of whose lengths should be equal to the corresponding
kindarray parameter, so the
kindarray of that routine should be in the reverse of the order of the iodim arrays (see above).
In general, you should take care to use Fortran data types that
correspond to (i.e. are the same size as) the C types used by FFTW.
In practice, this correspondence is usually straightforward
integer corresponds to
float, etcetera). The native Fortran
double/single-precision complex type should be compatible with
fftwf_complex. Such simple correspondences
are assumed in the examples below.
Technically, Fortran 77 identifiers are not allowed to have more than 6 characters, nor may they contain underscores. Any compiler that enforces this limitation doesn’t deserve to link to FFTW.
The reason for this is that some Fortran implementations seem to have trouble with C function return values, and vice versa.