annotate src/fftw-3.3.3/doc/legacy-fortran.texi @ 145:13a516fa8999

Update PortAudio build for Win64
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 10 Jan 2017 11:28:20 +0000
parents 89f5e221ed7b
children
rev   line source
cannam@95 1 @node Calling FFTW from Legacy Fortran, Upgrading from FFTW version 2, Calling FFTW from Modern Fortran, Top
cannam@95 2 @chapter Calling FFTW from Legacy Fortran
cannam@95 3 @cindex Fortran interface
cannam@95 4
cannam@95 5 This chapter describes the interface to FFTW callable by Fortran code
cannam@95 6 in older compilers not supporting the Fortran 2003 C interoperability
cannam@95 7 features (@pxref{Calling FFTW from Modern Fortran}). This interface
cannam@95 8 has the major disadvantage that it is not type-checked, so if you
cannam@95 9 mistake the argument types or ordering then your program will not have
cannam@95 10 any compiler errors, and will likely crash at runtime. So, greater
cannam@95 11 care is needed. Also, technically interfacing older Fortran versions
cannam@95 12 to C is nonstandard, but in practice we have found that the techniques
cannam@95 13 used in this chapter have worked with all known Fortran compilers for
cannam@95 14 many years.
cannam@95 15
cannam@95 16 The legacy Fortran interface differs from the C interface only in the
cannam@95 17 prefix (@samp{dfftw_} instead of @samp{fftw_} in double precision) and
cannam@95 18 a few other minor details. This Fortran interface is included in the
cannam@95 19 FFTW libraries by default, unless a Fortran compiler isn't found on
cannam@95 20 your system or @code{--disable-fortran} is included in the
cannam@95 21 @code{configure} flags. We assume here that the reader is already
cannam@95 22 familiar with the usage of FFTW in C, as described elsewhere in this
cannam@95 23 manual.
cannam@95 24
cannam@95 25 The MPI parallel interface to FFTW is @emph{not} currently available
cannam@95 26 to legacy Fortran.
cannam@95 27
cannam@95 28 @menu
cannam@95 29 * Fortran-interface routines::
cannam@95 30 * FFTW Constants in Fortran::
cannam@95 31 * FFTW Execution in Fortran::
cannam@95 32 * Fortran Examples::
cannam@95 33 * Wisdom of Fortran?::
cannam@95 34 @end menu
cannam@95 35
cannam@95 36 @c -------------------------------------------------------
cannam@95 37 @node Fortran-interface routines, FFTW Constants in Fortran, Calling FFTW from Legacy Fortran, Calling FFTW from Legacy Fortran
cannam@95 38 @section Fortran-interface routines
cannam@95 39
cannam@95 40 Nearly all of the FFTW functions have Fortran-callable equivalents.
cannam@95 41 The name of the legacy Fortran routine is the same as that of the
cannam@95 42 corresponding C routine, but with the @samp{fftw_} prefix replaced by
cannam@95 43 @samp{dfftw_}.@footnote{Technically, Fortran 77 identifiers are not
cannam@95 44 allowed to have more than 6 characters, nor may they contain
cannam@95 45 underscores. Any compiler that enforces this limitation doesn't
cannam@95 46 deserve to link to FFTW.} The single and long-double precision
cannam@95 47 versions use @samp{sfftw_} and @samp{lfftw_}, respectively, instead of
cannam@95 48 @samp{fftwf_} and @samp{fftwl_}; quadruple precision (@code{real*16})
cannam@95 49 is available on some systems as @samp{fftwq_} (@pxref{Precision}).
cannam@95 50 (Note that @code{long double} on x86 hardware is usually at most
cannam@95 51 80-bit extended precision, @emph{not} quadruple precision.)
cannam@95 52
cannam@95 53 For the most part, all of the arguments to the functions are the same,
cannam@95 54 with the following exceptions:
cannam@95 55
cannam@95 56 @itemize @bullet
cannam@95 57
cannam@95 58 @item
cannam@95 59 @code{plan} variables (what would be of type @code{fftw_plan} in C),
cannam@95 60 must be declared as a type that is at least as big as a pointer
cannam@95 61 (address) on your machine. We recommend using @code{integer*8} everywhere,
cannam@95 62 since this should always be big enough.
cannam@95 63 @cindex portability
cannam@95 64
cannam@95 65 @item
cannam@95 66 Any function that returns a value (e.g. @code{fftw_plan_dft}) is
cannam@95 67 converted into a @emph{subroutine}. The return value is converted into
cannam@95 68 an additional @emph{first} parameter of this subroutine.@footnote{The
cannam@95 69 reason for this is that some Fortran implementations seem to have
cannam@95 70 trouble with C function return values, and vice versa.}
cannam@95 71
cannam@95 72 @item
cannam@95 73 @cindex column-major
cannam@95 74 The Fortran routines expect multi-dimensional arrays to be in
cannam@95 75 @emph{column-major} order, which is the ordinary format of Fortran
cannam@95 76 arrays (@pxref{Multi-dimensional Array Format}). They do this
cannam@95 77 transparently and costlessly simply by reversing the order of the
cannam@95 78 dimensions passed to FFTW, but this has one important consequence for
cannam@95 79 multi-dimensional real-complex transforms, discussed below.
cannam@95 80
cannam@95 81 @item
cannam@95 82 Wisdom import and export is somewhat more tricky because one cannot
cannam@95 83 easily pass files or strings between C and Fortran; see @ref{Wisdom of
cannam@95 84 Fortran?}.
cannam@95 85
cannam@95 86 @item
cannam@95 87 Legacy Fortran cannot use the @code{fftw_malloc} dynamic-allocation routine.
cannam@95 88 If you want to exploit the SIMD FFTW (@pxref{SIMD alignment and fftw_malloc}), you'll
cannam@95 89 need to figure out some other way to ensure that your arrays are at
cannam@95 90 least 16-byte aligned.
cannam@95 91
cannam@95 92 @item
cannam@95 93 @tindex fftw_iodim
cannam@95 94 @cindex guru interface
cannam@95 95 Since Fortran 77 does not have data structures, the @code{fftw_iodim}
cannam@95 96 structure from the guru interface (@pxref{Guru vector and transform
cannam@95 97 sizes}) must be split into separate arguments. In particular, any
cannam@95 98 @code{fftw_iodim} array arguments in the C guru interface become three
cannam@95 99 integer array arguments (@code{n}, @code{is}, and @code{os}) in the
cannam@95 100 Fortran guru interface, all of whose lengths should be equal to the
cannam@95 101 corresponding @code{rank} argument.
cannam@95 102
cannam@95 103 @item
cannam@95 104 The guru planner interface in Fortran does @emph{not} do any automatic
cannam@95 105 translation between column-major and row-major; you are responsible
cannam@95 106 for setting the strides etcetera to correspond to your Fortran arrays.
cannam@95 107 However, as a slight bug that we are preserving for backwards
cannam@95 108 compatibility, the @samp{plan_guru_r2r} in Fortran @emph{does} reverse the
cannam@95 109 order of its @code{kind} array parameter, so the @code{kind} array
cannam@95 110 of that routine should be in the reverse of the order of the iodim
cannam@95 111 arrays (see above).
cannam@95 112
cannam@95 113 @end itemize
cannam@95 114
cannam@95 115 In general, you should take care to use Fortran data types that
cannam@95 116 correspond to (i.e. are the same size as) the C types used by FFTW.
cannam@95 117 In practice, this correspondence is usually straightforward
cannam@95 118 (i.e. @code{integer} corresponds to @code{int}, @code{real}
cannam@95 119 corresponds to @code{float}, etcetera). The native Fortran
cannam@95 120 double/single-precision complex type should be compatible with
cannam@95 121 @code{fftw_complex}/@code{fftwf_complex}. Such simple correspondences
cannam@95 122 are assumed in the examples below.
cannam@95 123 @cindex portability
cannam@95 124
cannam@95 125 @c -------------------------------------------------------
cannam@95 126 @node FFTW Constants in Fortran, FFTW Execution in Fortran, Fortran-interface routines, Calling FFTW from Legacy Fortran
cannam@95 127 @section FFTW Constants in Fortran
cannam@95 128
cannam@95 129 When creating plans in FFTW, a number of constants are used to specify
cannam@95 130 options, such as @code{FFTW_MEASURE} or @code{FFTW_ESTIMATE}. The
cannam@95 131 same constants must be used with the wrapper routines, but of course the
cannam@95 132 C header files where the constants are defined can't be incorporated
cannam@95 133 directly into Fortran code.
cannam@95 134
cannam@95 135 Instead, we have placed Fortran equivalents of the FFTW constant
cannam@95 136 definitions in the file @code{fftw3.f}, which can be found in the same
cannam@95 137 directory as @code{fftw3.h}. If your Fortran compiler supports a
cannam@95 138 preprocessor of some sort, you should be able to @code{include} or
cannam@95 139 @code{#include} this file; otherwise, you can paste it directly into
cannam@95 140 your code.
cannam@95 141
cannam@95 142 @cindex flags
cannam@95 143 In C, you combine different flags (like @code{FFTW_PRESERVE_INPUT} and
cannam@95 144 @code{FFTW_MEASURE}) using the @samp{@code{|}} operator; in Fortran
cannam@95 145 you should just use @samp{@code{+}}. (Take care not to add in the
cannam@95 146 same flag more than once, though. Alternatively, you can use the
cannam@95 147 @code{ior} intrinsic function standardized in Fortran 95.)
cannam@95 148
cannam@95 149 @c -------------------------------------------------------
cannam@95 150 @node FFTW Execution in Fortran, Fortran Examples, FFTW Constants in Fortran, Calling FFTW from Legacy Fortran
cannam@95 151 @section FFTW Execution in Fortran
cannam@95 152
cannam@95 153 In C, in order to use a plan, one normally calls @code{fftw_execute},
cannam@95 154 which executes the plan to perform the transform on the input/output
cannam@95 155 arrays passed when the plan was created (@pxref{Using Plans}). The
cannam@95 156 corresponding subroutine call in legacy Fortran is:
cannam@95 157 @example
cannam@95 158 call dfftw_execute(plan)
cannam@95 159 @end example
cannam@95 160 @findex dfftw_execute
cannam@95 161
cannam@95 162 However, we have had reports that this causes problems with some
cannam@95 163 recent optimizing Fortran compilers. The problem is, because the
cannam@95 164 input/output arrays are not passed as explicit arguments to
cannam@95 165 @code{dfftw_execute}, the semantics of Fortran (unlike C) allow the
cannam@95 166 compiler to assume that the input/output arrays are not changed by
cannam@95 167 @code{dfftw_execute}. As a consequence, certain compilers end up
cannam@95 168 optimizing out or repositioning the call to @code{dfftw_execute},
cannam@95 169 assuming incorrectly that it does nothing.
cannam@95 170
cannam@95 171 There are various workarounds to this, but the safest and simplest
cannam@95 172 thing is to not use @code{dfftw_execute} in Fortran. Instead, use the
cannam@95 173 functions described in @ref{New-array Execute Functions}, which take
cannam@95 174 the input/output arrays as explicit arguments. For example, if the
cannam@95 175 plan is for a complex-data DFT and was created for the arrays
cannam@95 176 @code{in} and @code{out}, you would do:
cannam@95 177 @example
cannam@95 178 call dfftw_execute_dft(plan, in, out)
cannam@95 179 @end example
cannam@95 180 @findex dfftw_execute_dft
cannam@95 181
cannam@95 182 There are a few things to be careful of, however:
cannam@95 183
cannam@95 184 @itemize @bullet
cannam@95 185
cannam@95 186 @item
cannam@95 187 You must use the correct type of execute function, matching the way
cannam@95 188 the plan was created. Complex DFT plans should use
cannam@95 189 @code{dfftw_execute_dft}, Real-input (r2c) DFT plans should use use
cannam@95 190 @code{dfftw_execute_dft_r2c}, and real-output (c2r) DFT plans should
cannam@95 191 use @code{dfftw_execute_dft_c2r}. The various r2r plans should use
cannam@95 192 @code{dfftw_execute_r2r}.
cannam@95 193
cannam@95 194 @item
cannam@95 195 You should normally pass the same input/output arrays that were used when
cannam@95 196 creating the plan. This is always safe.
cannam@95 197
cannam@95 198 @item
cannam@95 199 @emph{If} you pass @emph{different} input/output arrays compared to
cannam@95 200 those used when creating the plan, you must abide by all the
cannam@95 201 restrictions of the new-array execute functions (@pxref{New-array
cannam@95 202 Execute Functions}). The most difficult of these, in Fortran, is the
cannam@95 203 requirement that the new arrays have the same alignment as the
cannam@95 204 original arrays, because there seems to be no way in legacy Fortran to obtain
cannam@95 205 guaranteed-aligned arrays (analogous to @code{fftw_malloc} in C). You
cannam@95 206 can, of course, use the @code{FFTW_UNALIGNED} flag when creating the
cannam@95 207 plan, in which case the plan does not depend on the alignment, but
cannam@95 208 this may sacrifice substantial performance on architectures (like x86)
cannam@95 209 with SIMD instructions (@pxref{SIMD alignment and fftw_malloc}).
cannam@95 210 @ctindex FFTW_UNALIGNED
cannam@95 211
cannam@95 212 @end itemize
cannam@95 213
cannam@95 214 @c -------------------------------------------------------
cannam@95 215 @node Fortran Examples, Wisdom of Fortran?, FFTW Execution in Fortran, Calling FFTW from Legacy Fortran
cannam@95 216 @section Fortran Examples
cannam@95 217
cannam@95 218 In C, you might have something like the following to transform a
cannam@95 219 one-dimensional complex array:
cannam@95 220
cannam@95 221 @example
cannam@95 222 fftw_complex in[N], out[N];
cannam@95 223 fftw_plan plan;
cannam@95 224
cannam@95 225 plan = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
cannam@95 226 fftw_execute(plan);
cannam@95 227 fftw_destroy_plan(plan);
cannam@95 228 @end example
cannam@95 229
cannam@95 230 In Fortran, you would use the following to accomplish the same thing:
cannam@95 231
cannam@95 232 @example
cannam@95 233 double complex in, out
cannam@95 234 dimension in(N), out(N)
cannam@95 235 integer*8 plan
cannam@95 236
cannam@95 237 call dfftw_plan_dft_1d(plan,N,in,out,FFTW_FORWARD,FFTW_ESTIMATE)
cannam@95 238 call dfftw_execute_dft(plan, in, out)
cannam@95 239 call dfftw_destroy_plan(plan)
cannam@95 240 @end example
cannam@95 241 @findex dfftw_plan_dft_1d
cannam@95 242 @findex dfftw_execute_dft
cannam@95 243 @findex dfftw_destroy_plan
cannam@95 244
cannam@95 245 Notice how all routines are called as Fortran subroutines, and the
cannam@95 246 plan is returned via the first argument to @code{dfftw_plan_dft_1d}.
cannam@95 247 Notice also that we changed @code{fftw_execute} to
cannam@95 248 @code{dfftw_execute_dft} (@pxref{FFTW Execution in Fortran}). To do
cannam@95 249 the same thing, but using 8 threads in parallel (@pxref{Multi-threaded
cannam@95 250 FFTW}), you would simply prefix these calls with:
cannam@95 251
cannam@95 252 @example
cannam@95 253 integer iret
cannam@95 254 call dfftw_init_threads(iret)
cannam@95 255 call dfftw_plan_with_nthreads(8)
cannam@95 256 @end example
cannam@95 257 @findex dfftw_init_threads
cannam@95 258 @findex dfftw_plan_with_nthreads
cannam@95 259
cannam@95 260 (You might want to check the value of @code{iret}: if it is zero, it
cannam@95 261 indicates an unlikely error during thread initialization.)
cannam@95 262
cannam@95 263 To transform a three-dimensional array in-place with C, you might do:
cannam@95 264
cannam@95 265 @example
cannam@95 266 fftw_complex arr[L][M][N];
cannam@95 267 fftw_plan plan;
cannam@95 268
cannam@95 269 plan = fftw_plan_dft_3d(L,M,N, arr,arr,
cannam@95 270 FFTW_FORWARD, FFTW_ESTIMATE);
cannam@95 271 fftw_execute(plan);
cannam@95 272 fftw_destroy_plan(plan);
cannam@95 273 @end example
cannam@95 274
cannam@95 275 In Fortran, you would use this instead:
cannam@95 276
cannam@95 277 @example
cannam@95 278 double complex arr
cannam@95 279 dimension arr(L,M,N)
cannam@95 280 integer*8 plan
cannam@95 281
cannam@95 282 call dfftw_plan_dft_3d(plan, L,M,N, arr,arr,
cannam@95 283 & FFTW_FORWARD, FFTW_ESTIMATE)
cannam@95 284 call dfftw_execute_dft(plan, arr, arr)
cannam@95 285 call dfftw_destroy_plan(plan)
cannam@95 286 @end example
cannam@95 287 @findex dfftw_plan_dft_3d
cannam@95 288
cannam@95 289 Note that we pass the array dimensions in the ``natural'' order in both C
cannam@95 290 and Fortran.
cannam@95 291
cannam@95 292 To transform a one-dimensional real array in Fortran, you might do:
cannam@95 293
cannam@95 294 @example
cannam@95 295 double precision in
cannam@95 296 dimension in(N)
cannam@95 297 double complex out
cannam@95 298 dimension out(N/2 + 1)
cannam@95 299 integer*8 plan
cannam@95 300
cannam@95 301 call dfftw_plan_dft_r2c_1d(plan,N,in,out,FFTW_ESTIMATE)
cannam@95 302 call dfftw_execute_dft_r2c(plan, in, out)
cannam@95 303 call dfftw_destroy_plan(plan)
cannam@95 304 @end example
cannam@95 305 @findex dfftw_plan_dft_r2c_1d
cannam@95 306 @findex dfftw_execute_dft_r2c
cannam@95 307
cannam@95 308 To transform a two-dimensional real array, out of place, you might use
cannam@95 309 the following:
cannam@95 310
cannam@95 311 @example
cannam@95 312 double precision in
cannam@95 313 dimension in(M,N)
cannam@95 314 double complex out
cannam@95 315 dimension out(M/2 + 1, N)
cannam@95 316 integer*8 plan
cannam@95 317
cannam@95 318 call dfftw_plan_dft_r2c_2d(plan,M,N,in,out,FFTW_ESTIMATE)
cannam@95 319 call dfftw_execute_dft_r2c(plan, in, out)
cannam@95 320 call dfftw_destroy_plan(plan)
cannam@95 321 @end example
cannam@95 322 @findex dfftw_plan_dft_r2c_2d
cannam@95 323
cannam@95 324 @strong{Important:} Notice that it is the @emph{first} dimension of the
cannam@95 325 complex output array that is cut in half in Fortran, rather than the
cannam@95 326 last dimension as in C. This is a consequence of the interface routines
cannam@95 327 reversing the order of the array dimensions passed to FFTW so that the
cannam@95 328 Fortran program can use its ordinary column-major order.
cannam@95 329 @cindex column-major
cannam@95 330 @cindex r2c/c2r multi-dimensional array format
cannam@95 331
cannam@95 332 @c -------------------------------------------------------
cannam@95 333 @node Wisdom of Fortran?, , Fortran Examples, Calling FFTW from Legacy Fortran
cannam@95 334 @section Wisdom of Fortran?
cannam@95 335
cannam@95 336 In this section, we discuss how one can import/export FFTW wisdom
cannam@95 337 (saved plans) to/from a Fortran program; we assume that the reader is
cannam@95 338 already familiar with wisdom, as described in @ref{Words of
cannam@95 339 Wisdom-Saving Plans}.
cannam@95 340
cannam@95 341 @cindex portability
cannam@95 342 The basic problem is that is difficult to (portably) pass files and
cannam@95 343 strings between Fortran and C, so we cannot provide a direct Fortran
cannam@95 344 equivalent to the @code{fftw_export_wisdom_to_file}, etcetera,
cannam@95 345 functions. Fortran interfaces @emph{are} provided for the functions
cannam@95 346 that do not take file/string arguments, however:
cannam@95 347 @code{dfftw_import_system_wisdom}, @code{dfftw_import_wisdom},
cannam@95 348 @code{dfftw_export_wisdom}, and @code{dfftw_forget_wisdom}.
cannam@95 349 @findex dfftw_import_system_wisdom
cannam@95 350 @findex dfftw_import_wisdom
cannam@95 351 @findex dfftw_export_wisdom
cannam@95 352 @findex dfftw_forget_wisdom
cannam@95 353
cannam@95 354
cannam@95 355 So, for example, to import the system-wide wisdom, you would do:
cannam@95 356
cannam@95 357 @example
cannam@95 358 integer isuccess
cannam@95 359 call dfftw_import_system_wisdom(isuccess)
cannam@95 360 @end example
cannam@95 361
cannam@95 362 As usual, the C return value is turned into a first parameter;
cannam@95 363 @code{isuccess} is non-zero on success and zero on failure (e.g. if
cannam@95 364 there is no system wisdom installed).
cannam@95 365
cannam@95 366 If you want to import/export wisdom from/to an arbitrary file or
cannam@95 367 elsewhere, you can employ the generic @code{dfftw_import_wisdom} and
cannam@95 368 @code{dfftw_export_wisdom} functions, for which you must supply a
cannam@95 369 subroutine to read/write one character at a time. The FFTW package
cannam@95 370 contains an example file @code{doc/f77_wisdom.f} demonstrating how to
cannam@95 371 implement @code{import_wisdom_from_file} and
cannam@95 372 @code{export_wisdom_to_file} subroutines in this way. (These routines
cannam@95 373 cannot be compiled into the FFTW library itself, lest all FFTW-using
cannam@95 374 programs be required to link with the Fortran I/O library.)