cannam@127: cannam@127: cannam@127: cannam@127: cannam@127:
cannam@127:cannam@127: Next: Reversing array dimensions, Previous: Calling FFTW from Modern Fortran, Up: Calling FFTW from Modern Fortran [Contents][Index]
cannam@127:FFTW provides a file fftw3.f03
that defines Fortran 2003
cannam@127: interfaces for all of its C routines, except for the MPI routines
cannam@127: described elsewhere, which can be found in the same directory as
cannam@127: fftw3.h
(the C header file). In any Fortran subroutine where
cannam@127: you want to use FFTW functions, you should begin with:
cannam@127:
use, intrinsic :: iso_c_binding cannam@127: include 'fftw3.f03' cannam@127:
This includes the interface definitions and the standard
cannam@127: iso_c_binding
module (which defines the equivalents of C
cannam@127: types). You can also put the FFTW functions into a module if you
cannam@127: prefer (see Defining an FFTW module).
cannam@127:
At this point, you can now call anything in the FFTW C interface cannam@127: directly, almost exactly as in C other than minor changes in syntax. cannam@127: For example: cannam@127:
cannam@127: cannam@127: cannam@127: cannam@127:type(C_PTR) :: plan cannam@127: complex(C_DOUBLE_COMPLEX), dimension(1024,1000) :: in, out cannam@127: plan = fftw_plan_dft_2d(1000,1024, in,out, FFTW_FORWARD,FFTW_ESTIMATE) cannam@127: ... cannam@127: call fftw_execute_dft(plan, in, out) cannam@127: ... cannam@127: call fftw_destroy_plan(plan) cannam@127:
A few important things to keep in mind are: cannam@127:
cannam@127:type(C_PTR)
. Other C types are mapped in the
cannam@127: obvious way via the iso_c_binding
standard: int
turns
cannam@127: into integer(C_INT)
, fftw_complex
turns into
cannam@127: complex(C_DOUBLE_COMPLEX)
, double
turns into
cannam@127: real(C_DOUBLE)
, and so on. See FFTW Fortran type reference.
cannam@127:
cannam@127: fftw_execute
cannam@127: but rather using the more specialized functions like
cannam@127: fftw_execute_dft
(see New-array Execute Functions).
cannam@127: However, you should execute the plan on the same arrays
as the
cannam@127: ones for which you created the plan, unless you are especially
cannam@127: careful. See Plan execution in Fortran. To prevent
cannam@127: you from using fftw_execute
by mistake, the fftw3.f03
cannam@127: file does not provide an fftw_execute
interface declaration.
cannam@127:
cannam@127: ior
(equivalent to ‘|’ in C). e.g. FFTW_MEASURE | FFTW_DESTROY_INPUT
becomes ior(FFTW_MEASURE, FFTW_DESTROY_INPUT)
. (You can also use ‘+’ as long as you don’t try to include a given flag more than once.)
cannam@127:
cannam@127: • Extended and quadruple precision in Fortran: | cannam@127: |
cannam@127: Next: Reversing array dimensions, Previous: Calling FFTW from Modern Fortran, Up: Calling FFTW from Modern Fortran [Contents][Index]
cannam@127: