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