File size: 5,792 Bytes
c011401
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

\section{Introduction}
\label{sec:intro}

\fpy is a command line tool that generates Python C/API modules for
interfacing Fortran~77/90/95 codes and Fortran~90/95 modules from
Python.  In general, using \fpy an
interface is produced in three steps:
\begin{itemize}
\item[(i)] \fpy scans Fortran sources and creates the so-called
  \emph{signature} file; the signature file contains the signatures of
  Fortran routines; the signatures are given in the free format of the
  Fortran~90/95 language specification. Latest version of \fpy
  generates also a make file for building shared module.  
  About currently supported compilers see the \fpy home page
\item[(ii)] Optionally, the signature files can be modified manually
  in order to dictate how the Fortran routines should be called or
  seemed from the Python environment.
\item[(iii)] \fpy reads the signature files and generates Python C/API
  modules that can be compiled and imported to Python code. In
  addition, a LaTeX document is generated that contains the
  documentation of wrapped functions.
\end{itemize}
(Note that if you are satisfied with the default signature that \fpy
generates in step (i), all three steps can be covered with just
one call to \fpy --- by not specifying `\texttt{-h}' flag).
Latest versions of \fpy support so-called \fpy directive that allows
inserting various information about wrapping directly to Fortran
source code as comments (\texttt{<comment char>f2py  <signature statement>}).

The following diagram illustrates the usage of the tool:
\begin{verbatim}
! Fortran file foo.f:
      subroutine foo(a)
      integer a
      a = a + 5
      end
\end{verbatim}
\begin{verbatim}
! Fortran file bar.f:
      function bar(a,b)
      integer a,b,bar
      bar = a + b
      end
\end{verbatim}
\begin{itemize}
\item[(i)] \shell{\fpy foo.f bar.f -m foobar -h foobar.pyf}
\end{itemize}
\begin{verbatim}
!%f90
! Signature file: foobar.pyf
python module foobar ! in
    interface  ! in :foobar
        subroutine foo(a) ! in :foobar:foo.f
            integer intent(inout) :: a
        end subroutine foo
        function bar(a,b) ! in :foobar:bar.f
            integer :: a
            integer :: b
            integer :: bar
        end function bar
    end interface
end python module foobar
\end{verbatim}
\begin{itemize}
\item[(ii)] Edit the signature file (here I made \texttt{foo}s
  argument \texttt{a} to be \texttt{intent(inout)}, see
  Sec.~\ref{sec:attributes}).
\item[(iii)] \shell{\fpy foobar.pyf}
\end{itemize}
\begin{verbatim}
/* Python C/API module: foobarmodule.c */
...
\end{verbatim}
\begin{itemize}
\item[(iv)] \shell{make -f Makefile-foobar}
%\shell{gcc -shared -I/usr/include/python1.5/ foobarmodule.c\bs\\
%foo.f bar.f -o foobarmodule.so}
\end{itemize}
\begin{verbatim}
Python shared module: foobarmodule.so
\end{verbatim}
\begin{itemize}
\item[(v)] Usage in Python:
\end{itemize}
\vspace*{-4ex}
\begin{verbatim}
>>> import foobar
>>> print foobar.__doc__
This module 'foobar' is auto-generated with f2py (version:1.174).
The following functions are available:
  foo(a)
  bar = bar(a,b)
.
>>> print foobar.bar(2,3)
5
>>> from Numeric import *
>>> a = array(3)
>>> print a,foobar.foo(a),a
3 None 8
\end{verbatim}
Information about how to call \fpy (steps (i) and (iii)) can be
obtained by executing\\
\shell{\fpy}\\
This will print the usage instructions.
 Step (iv) is system dependent
(compiler and the locations of the header files \texttt{Python.h} and
\texttt{arrayobject.h}), and so you must know how to compile a shared
module for Python in you system.

The next Section describes the step (ii) in more detail in order to
explain how you can influence to the process of interface generation
so that the users can enjoy more writing Python programs using your
wrappers that call Fortran routines.  Step (v) is covered in
Sec.~\ref{sec:notes}.


\subsection{Features}
\label{sec:features}

\fpy has the following features:
\begin{enumerate}
\item \fpy scans real Fortran codes and produces the signature files.
  The syntax of the signature files is borrowed from the Fortran~90/95
  language specification with some extensions.
\item \fpy uses the signature files to produce the wrappers for
  Fortran~77 routines and their \texttt{COMMON} blocks.
\item For \texttt{external} arguments \fpy constructs a very flexible
  call-back mechanism so that Python functions can be called from
  Fortran.
\item You can pass in almost arbitrary Python objects to wrapper
  functions.  If needed, \fpy takes care of type-casting and
  non-contiguous arrays.
\item You can modify the signature files so that \fpy will generate
  wrapper functions with desired signatures.  \texttt{depend()}
  attribute is introduced to control the initialization order of the
  variables. \fpy introduces \texttt{intent(hide)} attribute to remove
  the particular argument from the argument list of the wrapper
  function.  In addition, \texttt{optional} and \texttt{required}
  attributes are introduced and employed.
\item \fpy supports almost all standard Fortran~77/90/95 constructs
  and understands all basic Fortran types, including
  (multi-dimensional, complex) arrays and character strings with
  adjustable and assumed sizes/lengths.
\item \fpy generates a LaTeX document containing the
  documentations of the wrapped functions (argument types, dimensions,
  etc). The user can easily add some human readable text to the
  documentation by inserting \texttt{note(<LaTeX text>)} attribute to
  the definition of routine signatures.
\item \fpy generates a GNU make file that can be used for building
  shared modules calling Fortran functions.
\item \fpy supports wrapping Fortran 90/95 module routines.
\end{enumerate}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "f2py2e"
%%% End: