cannam@95: cannam@95:
cannam@95:cannam@95: Next: Allocating aligned memory in Fortran, cannam@95: Previous: FFTW Fortran type reference, cannam@95: Up: Calling FFTW from Modern Fortran 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:
fftw_execute_dft, Real-input (r2c) DFT plans should use use
cannam@95: fftw_execute_dft_r2c, and real-output (c2r) DFT plans should
cannam@95: use fftw_execute_dft_c2r.  The various r2r plans should use
cannam@95: fftw_execute_r2r.  Fortunately, if you use the wrong one you
cannam@95: will get a compile-time type-mismatch error (unlike legacy Fortran).
cannam@95: 
cannam@95:      FFTW_UNALIGNED flag when creating the
cannam@95: plan, in which case the plan does not depend on the alignment, but
cannam@95: this may sacrifice substantial performance on architectures (like x86)
cannam@95: with SIMD instructions (see SIMD alignment and fftw_malloc). 
cannam@95: 
cannam@95: