annotate src/fftw-3.3.5/doc/html/Overview-of-Fortran-interface.html @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 2cd0e3b3e1fd
children
rev   line source
Chris@42 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Chris@42 2 <html>
Chris@42 3 <!-- This manual is for FFTW
Chris@42 4 (version 3.3.5, 30 July 2016).
Chris@42 5
Chris@42 6 Copyright (C) 2003 Matteo Frigo.
Chris@42 7
Chris@42 8 Copyright (C) 2003 Massachusetts Institute of Technology.
Chris@42 9
Chris@42 10 Permission is granted to make and distribute verbatim copies of this
Chris@42 11 manual provided the copyright notice and this permission notice are
Chris@42 12 preserved on all copies.
Chris@42 13
Chris@42 14 Permission is granted to copy and distribute modified versions of this
Chris@42 15 manual under the conditions for verbatim copying, provided that the
Chris@42 16 entire resulting derived work is distributed under the terms of a
Chris@42 17 permission notice identical to this one.
Chris@42 18
Chris@42 19 Permission is granted to copy and distribute translations of this manual
Chris@42 20 into another language, under the above conditions for modified versions,
Chris@42 21 except that this permission notice may be stated in a translation
Chris@42 22 approved by the Free Software Foundation. -->
Chris@42 23 <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
Chris@42 24 <head>
Chris@42 25 <title>FFTW 3.3.5: Overview of Fortran interface</title>
Chris@42 26
Chris@42 27 <meta name="description" content="FFTW 3.3.5: Overview of Fortran interface">
Chris@42 28 <meta name="keywords" content="FFTW 3.3.5: Overview of Fortran interface">
Chris@42 29 <meta name="resource-type" content="document">
Chris@42 30 <meta name="distribution" content="global">
Chris@42 31 <meta name="Generator" content="makeinfo">
Chris@42 32 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Chris@42 33 <link href="index.html#Top" rel="start" title="Top">
Chris@42 34 <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
Chris@42 35 <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
Chris@42 36 <link href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" rel="up" title="Calling FFTW from Modern Fortran">
Chris@42 37 <link href="Extended-and-quadruple-precision-in-Fortran.html#Extended-and-quadruple-precision-in-Fortran" rel="next" title="Extended and quadruple precision in Fortran">
Chris@42 38 <link href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" rel="prev" title="Calling FFTW from Modern Fortran">
Chris@42 39 <style type="text/css">
Chris@42 40 <!--
Chris@42 41 a.summary-letter {text-decoration: none}
Chris@42 42 blockquote.smallquotation {font-size: smaller}
Chris@42 43 div.display {margin-left: 3.2em}
Chris@42 44 div.example {margin-left: 3.2em}
Chris@42 45 div.indentedblock {margin-left: 3.2em}
Chris@42 46 div.lisp {margin-left: 3.2em}
Chris@42 47 div.smalldisplay {margin-left: 3.2em}
Chris@42 48 div.smallexample {margin-left: 3.2em}
Chris@42 49 div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
Chris@42 50 div.smalllisp {margin-left: 3.2em}
Chris@42 51 kbd {font-style:oblique}
Chris@42 52 pre.display {font-family: inherit}
Chris@42 53 pre.format {font-family: inherit}
Chris@42 54 pre.menu-comment {font-family: serif}
Chris@42 55 pre.menu-preformatted {font-family: serif}
Chris@42 56 pre.smalldisplay {font-family: inherit; font-size: smaller}
Chris@42 57 pre.smallexample {font-size: smaller}
Chris@42 58 pre.smallformat {font-family: inherit; font-size: smaller}
Chris@42 59 pre.smalllisp {font-size: smaller}
Chris@42 60 span.nocodebreak {white-space:nowrap}
Chris@42 61 span.nolinebreak {white-space:nowrap}
Chris@42 62 span.roman {font-family:serif; font-weight:normal}
Chris@42 63 span.sansserif {font-family:sans-serif; font-weight:normal}
Chris@42 64 ul.no-bullet {list-style: none}
Chris@42 65 -->
Chris@42 66 </style>
Chris@42 67
Chris@42 68
Chris@42 69 </head>
Chris@42 70
Chris@42 71 <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
Chris@42 72 <a name="Overview-of-Fortran-interface"></a>
Chris@42 73 <div class="header">
Chris@42 74 <p>
Chris@42 75 Next: <a href="Reversing-array-dimensions.html#Reversing-array-dimensions" accesskey="n" rel="next">Reversing array dimensions</a>, Previous: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="p" rel="prev">Calling FFTW from Modern Fortran</a>, Up: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="u" rel="up">Calling FFTW from Modern Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 76 </div>
Chris@42 77 <hr>
Chris@42 78 <a name="Overview-of-Fortran-interface-1"></a>
Chris@42 79 <h3 class="section">7.1 Overview of Fortran interface</h3>
Chris@42 80
Chris@42 81 <p>FFTW provides a file <code>fftw3.f03</code> that defines Fortran 2003
Chris@42 82 interfaces for all of its C routines, except for the MPI routines
Chris@42 83 described elsewhere, which can be found in the same directory as
Chris@42 84 <code>fftw3.h</code> (the C header file). In any Fortran subroutine where
Chris@42 85 you want to use FFTW functions, you should begin with:
Chris@42 86 </p>
Chris@42 87 <a name="index-iso_005fc_005fbinding-1"></a>
Chris@42 88 <div class="example">
Chris@42 89 <pre class="example"> use, intrinsic :: iso_c_binding
Chris@42 90 include 'fftw3.f03'
Chris@42 91 </pre></div>
Chris@42 92
Chris@42 93 <p>This includes the interface definitions and the standard
Chris@42 94 <code>iso_c_binding</code> module (which defines the equivalents of C
Chris@42 95 types). You can also put the FFTW functions into a module if you
Chris@42 96 prefer (see <a href="Defining-an-FFTW-module.html#Defining-an-FFTW-module">Defining an FFTW module</a>).
Chris@42 97 </p>
Chris@42 98 <p>At this point, you can now call anything in the FFTW C interface
Chris@42 99 directly, almost exactly as in C other than minor changes in syntax.
Chris@42 100 For example:
Chris@42 101 </p>
Chris@42 102 <a name="index-fftw_005fplan_005fdft_005f2d-2"></a>
Chris@42 103 <a name="index-fftw_005fexecute_005fdft-2"></a>
Chris@42 104 <a name="index-fftw_005fdestroy_005fplan-3"></a>
Chris@42 105 <div class="example">
Chris@42 106 <pre class="example"> type(C_PTR) :: plan
Chris@42 107 complex(C_DOUBLE_COMPLEX), dimension(1024,1000) :: in, out
Chris@42 108 plan = fftw_plan_dft_2d(1000,1024, in,out, FFTW_FORWARD,FFTW_ESTIMATE)
Chris@42 109 ...
Chris@42 110 call fftw_execute_dft(plan, in, out)
Chris@42 111 ...
Chris@42 112 call fftw_destroy_plan(plan)
Chris@42 113 </pre></div>
Chris@42 114
Chris@42 115 <p>A few important things to keep in mind are:
Chris@42 116 </p>
Chris@42 117 <ul>
Chris@42 118 <li> <a name="index-fftw_005fcomplex-2"></a>
Chris@42 119 <a name="index-C_005fPTR"></a>
Chris@42 120 <a name="index-C_005fINT"></a>
Chris@42 121 <a name="index-C_005fDOUBLE"></a>
Chris@42 122 <a name="index-C_005fDOUBLE_005fCOMPLEX"></a>
Chris@42 123 FFTW plans are <code>type(C_PTR)</code>. Other C types are mapped in the
Chris@42 124 obvious way via the <code>iso_c_binding</code> standard: <code>int</code> turns
Chris@42 125 into <code>integer(C_INT)</code>, <code>fftw_complex</code> turns into
Chris@42 126 <code>complex(C_DOUBLE_COMPLEX)</code>, <code>double</code> turns into
Chris@42 127 <code>real(C_DOUBLE)</code>, and so on. See <a href="FFTW-Fortran-type-reference.html#FFTW-Fortran-type-reference">FFTW Fortran type reference</a>.
Chris@42 128
Chris@42 129 </li><li> Functions in C become functions in Fortran if they have a return value,
Chris@42 130 and subroutines in Fortran otherwise.
Chris@42 131
Chris@42 132 </li><li> The ordering of the Fortran array dimensions must be <em>reversed</em>
Chris@42 133 when they are passed to the FFTW plan creation, thanks to differences
Chris@42 134 in array indexing conventions (see <a href="Multi_002ddimensional-Array-Format.html#Multi_002ddimensional-Array-Format">Multi-dimensional Array Format</a>). This is <em>unlike</em> the legacy Fortran interface
Chris@42 135 (see <a href="Fortran_002dinterface-routines.html#Fortran_002dinterface-routines">Fortran-interface routines</a>), which reversed the dimensions
Chris@42 136 for you. See <a href="Reversing-array-dimensions.html#Reversing-array-dimensions">Reversing array dimensions</a>.
Chris@42 137
Chris@42 138 </li><li> <a name="index-alignment-4"></a>
Chris@42 139 <a name="index-SIMD-2"></a>
Chris@42 140 Using ordinary Fortran array declarations like this works, but may
Chris@42 141 yield suboptimal performance because the data may not be not aligned
Chris@42 142 to exploit SIMD instructions on modern proessors (see <a href="SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc">SIMD alignment and fftw_malloc</a>). Better performance will often be obtained
Chris@42 143 by allocating with &lsquo;<samp>fftw_alloc</samp>&rsquo;. See <a href="Allocating-aligned-memory-in-Fortran.html#Allocating-aligned-memory-in-Fortran">Allocating aligned memory in Fortran</a>.
Chris@42 144
Chris@42 145 </li><li> <a name="index-fftw_005fexecute-5"></a>
Chris@42 146 Similar to the legacy Fortran interface (see <a href="FFTW-Execution-in-Fortran.html#FFTW-Execution-in-Fortran">FFTW Execution in Fortran</a>), we currently recommend <em>not</em> using <code>fftw_execute</code>
Chris@42 147 but rather using the more specialized functions like
Chris@42 148 <code>fftw_execute_dft</code> (see <a href="New_002darray-Execute-Functions.html#New_002darray-Execute-Functions">New-array Execute Functions</a>).
Chris@42 149 However, you should execute the plan on the <code>same arrays</code> as the
Chris@42 150 ones for which you created the plan, unless you are especially
Chris@42 151 careful. See <a href="Plan-execution-in-Fortran.html#Plan-execution-in-Fortran">Plan execution in Fortran</a>. To prevent
Chris@42 152 you from using <code>fftw_execute</code> by mistake, the <code>fftw3.f03</code>
Chris@42 153 file does not provide an <code>fftw_execute</code> interface declaration.
Chris@42 154
Chris@42 155 </li><li> <a name="index-flags-8"></a>
Chris@42 156 Multiple planner flags are combined with <code>ior</code> (equivalent to &lsquo;<samp>|</samp>&rsquo; in C). e.g. <code>FFTW_MEASURE | FFTW_DESTROY_INPUT</code> becomes <code>ior(FFTW_MEASURE, FFTW_DESTROY_INPUT)</code>. (You can also use &lsquo;<samp>+</samp>&rsquo; as long as you don&rsquo;t try to include a given flag more than once.)
Chris@42 157
Chris@42 158 </li></ul>
Chris@42 159
Chris@42 160 <table class="menu" border="0" cellspacing="0">
Chris@42 161 <tr><td align="left" valign="top">&bull; <a href="Extended-and-quadruple-precision-in-Fortran.html#Extended-and-quadruple-precision-in-Fortran" accesskey="1">Extended and quadruple precision in Fortran</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
Chris@42 162 </td></tr>
Chris@42 163 </table>
Chris@42 164
Chris@42 165 <hr>
Chris@42 166 <div class="header">
Chris@42 167 <p>
Chris@42 168 Next: <a href="Reversing-array-dimensions.html#Reversing-array-dimensions" accesskey="n" rel="next">Reversing array dimensions</a>, Previous: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="p" rel="prev">Calling FFTW from Modern Fortran</a>, Up: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="u" rel="up">Calling FFTW from Modern Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 169 </div>
Chris@42 170
Chris@42 171
Chris@42 172
Chris@42 173 </body>
Chris@42 174 </html>