cannam@95: cannam@95: cannam@95: Plan execution in Fortran - FFTW 3.3.3 cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95: cannam@95:
cannam@95: cannam@95:

cannam@95: Next: , cannam@95: Previous: FFTW Fortran type reference, cannam@95: Up: Calling FFTW from Modern Fortran cannam@95:


cannam@95:
cannam@95: cannam@95:

7.4 Plan execution in Fortran

cannam@95: cannam@95:

In C, in order to use a plan, one normally calls fftw_execute, cannam@95: which executes the plan to perform the transform on the input/output cannam@95: arrays passed when the plan was created (see Using Plans). The cannam@95: corresponding subroutine call in modern Fortran is: cannam@95:

      call fftw_execute(plan)
cannam@95: 
cannam@95:

cannam@95: However, we have had reports that this causes problems with some cannam@95: recent optimizing Fortran compilers. The problem is, because the cannam@95: input/output arrays are not passed as explicit arguments to cannam@95: fftw_execute, the semantics of Fortran (unlike C) allow the cannam@95: compiler to assume that the input/output arrays are not changed by cannam@95: fftw_execute. As a consequence, certain compilers end up cannam@95: repositioning the call to fftw_execute, assuming incorrectly cannam@95: that it does nothing to the arrays. cannam@95: cannam@95:

There are various workarounds to this, but the safest and simplest cannam@95: thing is to not use fftw_execute in Fortran. Instead, use the cannam@95: functions described in New-array Execute Functions, which take cannam@95: the input/output arrays as explicit arguments. For example, if the cannam@95: plan is for a complex-data DFT and was created for the arrays cannam@95: in and out, you would do: cannam@95:

      call fftw_execute_dft(plan, in, out)
cannam@95: 
cannam@95:

cannam@95: There are a few things to be careful of, however: cannam@95: cannam@95:

cannam@95: cannam@95: cannam@95: cannam@95: