Chris@10: Chris@10: Chris@10: Plan execution in Fortran - FFTW 3.3.3 Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10: Chris@10:
Chris@10: Chris@10:

Chris@10: Next: , Chris@10: Previous: FFTW Fortran type reference, Chris@10: Up: Calling FFTW from Modern Fortran Chris@10:


Chris@10:
Chris@10: Chris@10:

7.4 Plan execution in Fortran

Chris@10: Chris@10:

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

      call fftw_execute(plan)
Chris@10: 
Chris@10:

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

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

      call fftw_execute_dft(plan, in, out)
Chris@10: 
Chris@10:

Chris@10: There are a few things to be careful of, however: Chris@10: Chris@10:

Chris@10: Chris@10: Chris@10: Chris@10: