
\section{Applications}
\label{sec:apps}


\subsection{Example: wrapping C library \texttt{fftw}}
\label{sec:wrapfftw}

Here follows a simple example how to use \fpy to generate a wrapper
for C functions. Let us create a FFT code using the functions in FFTW
library. I'll assume that the library \texttt{fftw} is configured with
\texttt{-{}-enable-shared} option. 

Here is the wrapper for the typical usage of FFTW:
\begin{verbatim}
/* File: wrap_dfftw.c */
#include <dfftw.h>

extern void dfftw_one(fftw_complex *in,fftw_complex *out,int *n) {
  fftw_plan p;
  p = fftw_create_plan(*n,FFTW_FORWARD,FFTW_ESTIMATE);
  fftw_one(p,in,out);
  fftw_destroy_plan(p);
}
\end{verbatim}
and here follows the corresponding siganture file (created manually):
\begin{verbatim}
!%f90
! File: fftw.f90
module fftw
  interface
     subroutine dfftw_one(in,out,n)
       integer n
       complex*16 in(n),out(n)
       intent(out) out
       intent(hide) n
     end subroutine dfftw_one
  end interface
end module fftw
\end{verbatim}

Now let us generate the Python C/API module with \fpy:
\begin{verbatim}
f2py fftw.f90
\end{verbatim}
and compile it
\begin{verbatim}
gcc -shared -I/numeric/include -I`f2py -I` -L/numeric/lib -ldfftw \
    -o fftwmodule.so -DNO_APPEND_FORTRAN fftwmodule.c wrap_dfftw.c
\end{verbatim}

In Python:
\begin{verbatim}
>>> from Numeric import *
>>> from fftw import *
>>> print dfftw_one.__doc__
Function signature:
  out = dfftw_one(in)
Required arguments:
  in : input rank-1 array('D') with bounds (n)
Return objects:
  out : rank-1 array('D') with bounds (n)
>>> print dfftw_one([1,2,3,4])
[ 10.+0.j  -2.+2.j  -2.+0.j  -2.-2.j]
>>> 
\end{verbatim}

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