File size: 15,734 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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369

\section{Signature file}
\label{sec:signaturefile}

The syntax of a signature file is borrowed from the Fortran~90/95
language specification. Almost all Fortran~90/95 standard constructs
are understood. Recall that Fortran~77 is a subset of Fortran~90/95.
This tool introduces also some new attributes that are used for
controlling the process of Fortran to Python interface construction.
In the following, a short overview of the constructs
used in signature files will be given.


\subsection{Module block}
\label{sec:moduleblock}

A signature file contains one or more \texttt{pythonmodule} blocks. A
\texttt{pythonmodule} block has the following structure:
\begin{verbatim}
python module <modulename>
  interface
    <routine signatures>
  end [interface]
  interface
    module <F90/95 modulename>
      <F90 module data type declarations>
      <F90 module routine signatures>
    end [module [<F90/95 modulename>]]
  end [interface]
end [pythonmodule [<modulename>]]
\end{verbatim}
For each \texttt{pythonmodule} block \fpy will generate a C-file
\texttt{<modulename>module.c} (see step (iii)).  (This is not true if
\texttt{<modulename>} contains substring \texttt{\_\_user\_\_}, see
Sec.~\ref{sec:cbmodule} and \texttt{external} attribute).

\subsection{Signatures of Fortran routines and Python functions}
\label{sec:routineblock}


The signature of a Fortran routine has the following structure:
\begin{verbatim}
[<typespec>] function|subroutine <routine name> [([<arguments>])] \
                                          [result (<entityname>)]
  [<argument type declarations>]
  [<argument attribute statements>]
  [<use statements>]
  [<common block statements>]
  [<other statements>]
end [function|subroutine [<routine name>]]
\end{verbatim}

Let us introduce also the signature of the corresponding wrapper
function:
\begin{verbatim}
def <routine name>(<required arguments>[,<optional arguments>]):
     ...
     return <return variables>
\end{verbatim}

Before you edit the signature file, you should first decide what is the
desired signature of the corresponding Python function. \fpy offers
many possibilities to control the interface construction process: you
may want to insert/change/remove various attributes in the
declarations of the arguments in order to change the appearance
of the arguments in the Python wrapper function.

\begin{itemize}
\item 
The definition of the \texttt{<argument type declaration>} is
\begin{verbatim}
<typespec> [[<attrspec>]::] <entitydecl>
\end{verbatim}
where
\begin{verbatim}
<typespec> := byte | character[<charselector>] 
           | complex[<kindselector>] | real[<kindselector>]
           | double complex | double precision 
           | integer[<kindselector>] | logical[<kindselector>] 
\end{verbatim}
\begin{verbatim}
<charselector> := *<charlen> | ([len=]<len>[,[kind]<kind>])
               | (kind=<kind>[,len=<len>])
<kindselector> := *<intlen> | ([kind=]<kind>)
\end{verbatim}
(there is no sense to modify \texttt{<typespec>}s generated by \fpy).
\texttt{<attrspec>} is a comma separated list of attributes (see
Sec.~\ref{sec:attributes});
\begin{verbatim}
<entitydecl> := <name> [[*<charlen>][(<arrayspec>)] 
                        | [(<arrayspec>)]*<charlen>]
                    | [/<init_expr>/ | =<init_expr>] [,<entitydecl>]
\end{verbatim}
where \texttt{<arrayspec>} is a comma separated list of dimension
bounds; \texttt{<init\_expr>} is a C-expression (see
Sec.~\ref{sec:C-expr}).  If an argument is not defined with
\texttt{<argument type declaration>}, its type is determined by
applying \texttt{implicit} rules (if it is not specifyied, then
standard rules are applied).

\item The definition of the \texttt{<argument attribute statement>} is 
a short form of the \texttt{<argument type declaration>}:
\begin{verbatim}
<attrspec> <entitydecl>
\end{verbatim}

\item \texttt{<use statement>} is defined as follows 
\begin{verbatim}
use <modulename> [,<rename_list> | ,ONLY:<only_list>]
<rename_list> := local_name=>use_name [,<rename_list>]
\end{verbatim}
  Currently the \texttt{use} statement is used to link call-back
  modules (Sec.~\ref{sec:cbmodule}) and the \texttt{external}
  arguments (call-back functions).

\item \texttt{<common block statement>} is defined as follows 
\begin{verbatim}
common /<commonname>/ <shortentitydecl>
\end{verbatim}
where
\begin{verbatim}
<shortentitydecl> := <name> [(<arrayspec>)] [,<shortentitydecl>]
\end{verbatim}
One \texttt{module} block should not contain two or more
\texttt{common} blocks with the same name. Otherwise, the later ones
are ignored.  The types of variables in \texttt{<shortentitydecl>} can
be defined in \texttt{<argument type declarations>}. Note that there
you can specify also the array specifications; then you don't need to
do that in \texttt{<shortentitydecl>}.
\end{itemize}

\subsection{Attributes}
\label{sec:attributes}

The following attributes are used by \fpy:
\begin{description}
\item[\texttt{optional}] --- the variable is moved to the end of
  optional argument list of the wrapper function. Default value of an
  optional argument can be specified using \texttt{<init\_expr>} in
  \texttt{entitydecl}.  You can use \texttt{optional} attribute also for
  \texttt{external} arguments (call-back functions), but it is your
  responsibility to ensure that it is given by the user if Fortran
  routine wants to call it.
\item[\texttt{required}] --- the variable is considered as a required
  argument (that is default). You will need this in order to overwrite
  the \texttt{optional} attribute that is automatically set when
  \texttt{<init\_expr>} is used. However, usage of this attribute
  should be rare.
\item[\texttt{dimension(<arrayspec>)}] --- used when the variable is
  an array. For unbounded dimensions symbols `\texttt{*}' or
  `\texttt{:}' can be used (then internally the corresponding
  dimensions are set to -1; you'll notice this when certain exceptions
  are raised).
\item[\texttt{external}] --- the variable is a call-back function. \fpy will
  construct a call-back mechanism for this function. Also call-back
  functions must be defined by their signatures, and there are several
  ways to do that. In most cases, \fpy will be able to determine the signatures
  of  call-back functions from the Fortran source code; then it
  builds an additional \texttt{module} block with a name containing
  string `\texttt{\_\_user\_\_}' (see Sec.~\ref{sec:cbmodule}) and
  includes \texttt{use} statement to the routines signature. Anyway,
  you should check that the generated signature is correct.
  
  Alternatively, you can specify the signature by inserting to the
  routines block a ``model'' how the call-back function would be called
  from Fortran. For subroutines you should use\\
  \hspace*{2em}\texttt{call <call-back name>(<arguments>)}\\
  and for functions\\%
  \hspace*{2em}\texttt{<return value> = <call-back name>(<arguments>)}\\
  The variables in \texttt{<arguments>} and \texttt{<return value>}
  must be defined as well. You can use the arguments of the main
  routine, for instance.
\item[\texttt{intent(<intentspec>)}] --- this specifies the
  ``intention'' of the variable. \texttt{<intentspec>} is a comma
  separated list of the following specifications:
  \begin{description}
  \item[\texttt{in}] --- the variable is considered to be an input
    variable (default). It means that the Fortran function uses only
    the value(s) of the variable and is assumed not to change it.
  \item[\texttt{inout}] --- the variable is considered to be an
    input/output variable which means that Fortran routine may change
    the value(s) of the variable. Note that in Python only array
    objects can be changed ``in place''. (\texttt{intent(outin)} is
    \texttt{intent(inout)}.)
  \item[\texttt{out}] --- the value of the (output) variable is
    returned by the wrapper function: it is appended to the list of
    \texttt{<returned variables>}. If \texttt{out} is specified alone,
    also \texttt{hide} is assumed.
  \item[\texttt{hide}] --- use this if the variable \emph{should not}
    or \emph{need not} to be in the list of wrapper function arguments
    (not even in optional ones). For example, this is assumed if
    \texttt{intent(out)} is used.  You can ``hide'' an argument if it
    has always a constant value specified in \texttt{<init\_expr>},
    for instance.
  \end{description}
  The following rules apply:
  \begin{itemize}
  \item if no \texttt{intent} attribute is specified, \texttt{intent(in)} is
  assumed;
  \item \texttt{intent(in,inout)} is \texttt{intent(in)};
  \item \texttt{intent(in,hide)}, \texttt{intent(inout,hide)} are \texttt{intent(hide)};
    \item \texttt{intent(out)} is \texttt{intent(out,hide)};
\item \texttt{intent(inout)} is NOT \texttt{intent(in,out)}.
  \end{itemize}
  In conclusion, the following combinations are ``minimal'':
  \texttt{intent(in)}, \texttt{intent(inout)}, \texttt{intent(out)},
  \texttt{intent(hide)}, \texttt{intent(in,out)}, and
  \texttt{intent(inout,out)}.
\item[\texttt{check([<C-booleanexpr>])}] --- if
  \texttt{<C-booleanexpr>} evaluates to zero, an exception is raised
  about incorrect value or size or any other incorrectness of the
  variable. If \texttt{check()} or \texttt{check} is used then \fpy
  will not try to guess the checks automatically.
\item[\texttt{depend([<names>])}] --- the variable depends on other
  variables listed in \texttt{<names>}. These dependence relations
  determine the order of internal initialization of the variables. If
  you need to change these relations then be careful not to break the
  dependence relations of other relevant variables. If
  \texttt{depend()} or \texttt{depend} is used then \fpy will not try
  to guess the dependence relations automatically.
\item[\texttt{note(<LaTeX text>)}] --- with this attribute you can
  include human readable documentation strings to the LaTeX document
  that \fpy generates. Do not insert here information that \fpy can
  establish by itself, such as, types, sizes, lengths of the
  variables.  Here you can insert almost arbitrary LaTeX text.  Note
  that \texttt{<LaTeX text>} is mainly used inside the LaTeX
  \texttt{description} environment.  Hint: you can use
  \texttt{\bs{}texttt\{<name>\}} for typesetting variable \texttt{<name>}
  in LaTeX. In order to get a new line to the LaTeX document, use
  \texttt{\bs{}n} followed by a space. For longer text, you may want
  to use line continuation feature of Fortran 90/95 language: set
  \texttt{\&} (ampersand)
  to be the last character in a line.
\item[\texttt{parameter}] --- the variable is parameter and it must
  have a value. If the parameter is used in dimension specification,
  it is replaced by its value. (Are there any other usages of
  parameters except in dimension specifications? Let me know and I'll
  add support for it).
\end{description}


\subsection{C-expressions}
\label{sec:C-expr}

The signature of a routine may contain C-expressions in
\begin{itemize}
\item \texttt{<init\_expr>} for initializing particular variable, or in
\item \texttt{<C-booleanexpr>} of the \texttt{check} attribute, or in
\item \texttt{<arrayspec>} of the \texttt{dimension} attribute.
\end{itemize}
A C-expression may contain
\begin{itemize}
\item standard C-statement,
\item functions offered in \texttt{math.h},
\item previously initialized variables (study
the dependence relations) from the argument list, and
\item the following CPP-macros:
  \begin{description}
  \item[\texttt{len(<name>)}] --- the length of an array \texttt{<name>};
  \item[\texttt{shape(<name>,<n>)}] --- the $n$-th dimension of an array
    \texttt{<name>};
  \item[\texttt{rank(<name>)}] --- the rank of an array \texttt{<name>};
  \item[\texttt{slen(<name>)}] --- the length of a string \texttt{<name>}.
  \end{description}
\end{itemize}


In addition, when initializing arrays, an index vector \texttt{int
  \_i[rank(<name>)];}
is available: \texttt{\_i[0]} refers to
the index of the first dimension, \texttt{\_i[1]} to the index of
the second dimension, etc. For example, the argument type declaration\\
\hspace*{2em}\texttt{integer a(10) = \_i[0]}\\
is equivalent with the following Python statement\\
\hspace*{2em}\texttt{a = array(range(10))}


\subsection{Required/optional arguments}
\label{sec:reqoptargs}

When \texttt{optional} attribute is used (including the usage of
\texttt{<init\_expr>} without the \texttt{required} attribute), the
corresponding variable in the argument list of a Fortran routine is
appended to the optional argument list of the wrapper function.

For optional array argument all dimensions must be bounded (not
\texttt{(*)} or \texttt{(:)}) and defined at the time of
initialization (dependence relations).

If the \texttt{None} object is passed in in place of a required array
argument, it will be considered as optional: that is, the memory is
allocated (of course, if it has unbounded dimensions, an exception
will be raised), and if \texttt{<init\_expr>} is defined,
initialization is carried out.


\subsection{Internal checks}
\label{sec:intchecks}

All array arguments are checked against the correctness of their rank.
If there is a mismatch, \fpy attempts to fix that by constructing an
array with a correct rank from the given array argument (there will be
no performance hit as no data is copied).  The freedom to do so is
given only if some dimensions are unbounded or their value is 1.  An
exception is raised when the sizes will not match.

All bounded dimensions of an array are checked to be larger or equal
to the dimensions specified in the signature.

So, you don't need to give explicit \texttt{check} attributes to check
these internal checks.


\subsection{Call-back modules}
\label{sec:cbmodule}

A Fortran routine may have \texttt{external} arguments (call-back
functions). The signatures of the call-back functions must be defined
in a call-back \texttt{module} block (its name contains
\texttt{\_\_user\_\_}), in general; other possibilities are described
in the \texttt{external} attribute specification (see
Sec.~\ref{sec:attributes}). For the signatures of call-back
functions the following restrictions apply:
\begin{itemize}
\item Attributes \texttt{external}, \texttt{check(...)}, and
  initialization statements are ignored.
\item Attribute \texttt{optional} is used only for changing the order
  of the arguments.
\item For arrays all dimension bounds must be specified. They may be
  C-expressions  containing variables from the argument list.
  Note that here CPP-macros \texttt{len}, \texttt{shape},
  \texttt{rank}, and \texttt{slen} are not available.
\end{itemize}


\subsection{Common blocks}
\label{sec:commonblocks}

All fields in a common block are mapped to arrays of appropriate sizes
and types. Scalars are mapped to rank-0 arrays. For multi-dimensional
fields the corresponding arrays are transposed. In the type
declarations of the variables representing the common block fields,
only \texttt{dimension(<arrayspec>)}, \texttt{intent(hide)}, and
\texttt{note(<LaTeX text>)} attributes are used, others are ignored.

\subsection{Including files}
\label{sec:include}

You can include files to the signature file using
\begin{verbatim}
include '<filename>'
\end{verbatim}
statement. It can be used in any part of the signature file.
If the file \texttt{<filename>} does not exists or it is not in the path,
the \texttt{include} line is ignored. 

\subsection{\fpy directives}
\label{sec:directives}

You can insert signature statements directly to Fortran source codes
as comments. Anything that follows \texttt{<comment char>f2py} is
regarded as normal statement for \fpy.

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