Chris@19: Chris@19: Chris@19: FFTW Execution in Fortran - FFTW 3.3.4 Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19: Chris@19:
Chris@19: Chris@19:

Chris@19: Next: , Chris@19: Previous: FFTW Constants in Fortran, Chris@19: Up: Calling FFTW from Legacy Fortran Chris@19:


Chris@19:
Chris@19: Chris@19:

8.3 FFTW Execution in Fortran

Chris@19: Chris@19:

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

             call dfftw_execute(plan)
Chris@19: 
Chris@19:

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

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

             call dfftw_execute_dft(plan, in, out)
Chris@19: 
Chris@19:

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

Chris@19: Chris@19: Chris@19: Chris@19: