tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/doc
/source
/f2py
/python-usage.rst
| ================================== | |
| Using F2PY bindings in Python | |
| ================================== | |
| All wrappers for Fortran/C routines, common blocks, or for Fortran | |
| 90 module data generated by F2PY are exposed to Python as ``fortran`` | |
| type objects. Routine wrappers are callable ``fortran`` type objects | |
| while wrappers to Fortran data have attributes referring to data | |
| objects. | |
| All ``fortran`` type object have attribute ``_cpointer`` that contains | |
| CObject referring to the C pointer of the corresponding Fortran/C | |
| function or variable in C level. Such CObjects can be used as an | |
| callback argument of F2PY generated functions to bypass Python C/API | |
| layer of calling Python functions from Fortran or C when the | |
| computational part of such functions is implemented in C or Fortran | |
| and wrapped with F2PY (or any other tool capable of providing CObject | |
| of a function). | |
| Consider a Fortran 77 file ``ftype.f``: | |
| .. include:: ftype.f | |
| :literal: | |
| and build a wrapper using ``f2py -c ftype.f -m ftype``. | |
| In Python: | |
| .. include:: ftype_session.dat | |
| :literal: | |
| Scalar arguments | |
| ================= | |
| In general, a scalar argument of a F2PY generated wrapper function can | |
| be ordinary Python scalar (integer, float, complex number) as well as | |
| an arbitrary sequence object (list, tuple, array, string) of | |
| scalars. In the latter case, the first element of the sequence object | |
| is passed to Fortran routine as a scalar argument. | |
| Note that when type-casting is required and there is possible loss of | |
| information (e.g. when type-casting float to integer or complex to | |
| float), F2PY does not raise any exception. In complex to real | |
| type-casting only the real part of a complex number is used. | |
| ``intent(inout)`` scalar arguments are assumed to be array objects in | |
| order to *in situ* changes to be effective. It is recommended to use | |
| arrays with proper type but also other types work. | |
| Consider the following Fortran 77 code: | |
| .. include:: scalar.f | |
| :literal: | |
| and wrap it using ``f2py -c -m scalar scalar.f``. | |
| In Python: | |
| .. include:: scalar_session.dat | |
| :literal: | |
| String arguments | |
| ================= | |
| F2PY generated wrapper functions accept (almost) any Python object as | |
| a string argument, ``str`` is applied for non-string objects. | |
| Exceptions are Numpy arrays that must have type code ``'c'`` or | |
| ``'1'`` when used as string arguments. | |
| A string can have arbitrary length when using it as a string argument | |
| to F2PY generated wrapper function. If the length is greater than | |
| expected, the string is truncated. If the length is smaller that | |
| expected, additional memory is allocated and filled with ``\0``. | |
| Because Python strings are immutable, an ``intent(inout)`` argument | |
| expects an array version of a string in order to *in situ* changes to | |
| be effective. | |
| Consider the following Fortran 77 code: | |
| .. include:: string.f | |
| :literal: | |
| and wrap it using ``f2py -c -m mystring string.f``. | |
| Python session: | |
| .. include:: string_session.dat | |
| :literal: | |
| Array arguments | |
| ================ | |
| In general, array arguments of F2PY generated wrapper functions accept | |
| arbitrary sequences that can be transformed to Numpy array objects. | |
| An exception is ``intent(inout)`` array arguments that always must be | |
| proper-contiguous and have proper type, otherwise an exception is | |
| raised. Another exception is ``intent(inplace)`` array arguments that | |
| attributes will be changed in-situ if the argument has different type | |
| than expected (see ``intent(inplace)`` attribute for more | |
| information). | |
| In general, if a Numpy array is proper-contiguous and has a proper | |
| type then it is directly passed to wrapped Fortran/C function. | |
| Otherwise, an element-wise copy of an input array is made and the | |
| copy, being proper-contiguous and with proper type, is used as an | |
| array argument. | |
| There are two types of proper-contiguous Numpy arrays: | |
| * Fortran-contiguous arrays when data is stored column-wise, | |
| i.e. indexing of data as stored in memory starts from the lowest | |
| dimension; | |
| * C-contiguous or simply contiguous arrays when data is stored | |
| row-wise, i.e. indexing of data as stored in memory starts from the | |
| highest dimension. | |
| For one-dimensional arrays these notions coincide. | |
| For example, an 2x2 array ``A`` is Fortran-contiguous if its elements | |
| are stored in memory in the following order:: | |
| A0,0 A1,0 A0,1 A1,1 | |
| and C-contiguous if the order is as follows:: | |
| A0,0 A0,1 A1,0 A1,1 | |
| To test whether an array is C-contiguous, use ``.iscontiguous()`` | |
| method of Numpy arrays. To test for Fortran contiguity, all | |
| F2PY generated extension modules provide a function | |
| ``has_column_major_storage(<array>)``. This function is equivalent to | |
| ``<array>.flags.f_contiguous`` but more efficient. | |
| Usually there is no need to worry about how the arrays are stored in | |
| memory and whether the wrapped functions, being either Fortran or C | |
| functions, assume one or another storage order. F2PY automatically | |
| ensures that wrapped functions get arguments with proper storage | |
| order; the corresponding algorithm is designed to make copies of | |
| arrays only when absolutely necessary. However, when dealing with very | |
| large multidimensional input arrays with sizes close to the size of | |
| the physical memory in your computer, then a care must be taken to use | |
| always proper-contiguous and proper type arguments. | |
| To transform input arrays to column major storage order before passing | |
| them to Fortran routines, use a function | |
| ``as_column_major_storage(<array>)`` that is provided by all F2PY | |
| generated extension modules. | |
| Consider Fortran 77 code: | |
| .. include:: array.f | |
| :literal: | |
| and wrap it using ``f2py -c -m arr array.f -DF2PY_REPORT_ON_ARRAY_COPY=1``. | |
| In Python: | |
| .. include:: array_session.dat | |
| :literal: | |
| .. _Call-back arguments: | |
| Call-back arguments | |
| ==================== | |
| F2PY supports calling Python functions from Fortran or C codes. | |
| Consider the following Fortran 77 code: | |
| .. include:: callback.f | |
| :literal: | |
| and wrap it using ``f2py -c -m callback callback.f``. | |
| In Python: | |
| .. include:: callback_session.dat | |
| :literal: | |
| In the above example F2PY was able to guess accurately the signature | |
| of a call-back function. However, sometimes F2PY cannot establish the | |
| signature as one would wish and then the signature of a call-back | |
| function must be modified in the signature file manually. Namely, | |
| signature files may contain special modules (the names of such modules | |
| contain a substring ``__user__``) that collect various signatures of | |
| call-back functions. Callback arguments in routine signatures have | |
| attribute ``external`` (see also ``intent(callback)`` attribute). To | |
| relate a callback argument and its signature in ``__user__`` module | |
| block, use ``use`` statement as illustrated below. The same signature | |
| of a callback argument can be referred in different routine | |
| signatures. | |
| We use the same Fortran 77 code as in previous example but now | |
| we'll pretend that F2PY was not able to guess the signatures of | |
| call-back arguments correctly. First, we create an initial signature | |
| file ``callback2.pyf`` using F2PY:: | |
| f2py -m callback2 -h callback2.pyf callback.f | |
| Then modify it as follows | |
| .. include:: callback2.pyf | |
| :literal: | |
| Finally, build the extension module using ``f2py -c callback2.pyf callback.f``. | |
| An example Python session would be identical to the previous example | |
| except that argument names would differ. | |
| Sometimes a Fortran package may require that users provide routines | |
| that the package will use. F2PY can construct an interface to such | |
| routines so that Python functions could be called from Fortran. | |
| Consider the following `Fortran 77 subroutine`__ that takes an array | |
| and applies a function ``func`` to its elements. | |
| .. include:: calculate.f | |
| :literal: | |
| It is expected that function ``func`` has been defined | |
| externally. In order to use a Python function as ``func``, it must | |
| have an attribute ``intent(callback)`` (it must be specified before | |
| the ``external`` statement). | |
| Finally, build an extension module using ``f2py -c -m foo calculate.f`` | |
| In Python: | |
| .. include:: calculate_session.dat | |
| :literal: | |
| The function is included as an argument to the python function call to | |
| the Fortran subroutine even though it was *not* in the Fortran subroutine argument | |
| list. The "external" refers to the C function generated by f2py, not the python | |
| function itself. The python function must be supplied to the C function. | |
| The callback function may also be explicitly set in the module. | |
| Then it is not necessary to pass the function in the argument list to | |
| the Fortran function. This may be desired if the Fortran function calling | |
| the python callback function is itself called by another Fortran function. | |
| Consider the following Fortran 77 subroutine: | |
| .. include:: extcallback.f | |
| :literal: | |
| and wrap it using ``f2py -c -m pfromf extcallback.f``. | |
| In Python: | |
| .. include:: extcallback_session.dat | |
| :literal: | |
| Resolving arguments to call-back functions | |
| ------------------------------------------ | |
| F2PY generated interface is very flexible with respect to call-back | |
| arguments. For each call-back argument an additional optional | |
| argument ``<name>_extra_args`` is introduced by F2PY. This argument | |
| can be used to pass extra arguments to user provided call-back | |
| arguments. | |
| If a F2PY generated wrapper function expects the following call-back | |
| argument:: | |
| def fun(a_1,...,a_n): | |
| ... | |
| return x_1,...,x_k | |
| but the following Python function | |
| :: | |
| def gun(b_1,...,b_m): | |
| ... | |
| return y_1,...,y_l | |
| is provided by an user, and in addition, | |
| :: | |
| fun_extra_args = (e_1,...,e_p) | |
| is used, then the following rules are applied when a Fortran or C | |
| function calls the call-back argument ``gun``: | |
| * If ``p == 0`` then ``gun(a_1, ..., a_q)`` is called, here | |
| ``q = min(m, n)``. | |
| * If ``n + p <= m`` then ``gun(a_1, ..., a_n, e_1, ..., e_p)`` is called. | |
| * If ``p <= m < n + p`` then ``gun(a_1, ..., a_q, e_1, ..., e_p)`` is called, here | |
| ``q=m-p``. | |
| * If ``p > m`` then ``gun(e_1, ..., e_m)`` is called. | |
| * If ``n + p`` is less than the number of required arguments to ``gun`` | |
| then an exception is raised. | |
| The function ``gun`` may return any number of objects as a tuple. Then | |
| following rules are applied: | |
| * If ``k < l``, then ``y_{k + 1}, ..., y_l`` are ignored. | |
| * If ``k > l``, then only ``x_1, ..., x_l`` are set. | |
| Common blocks | |
| ============== | |
| F2PY generates wrappers to ``common`` blocks defined in a routine | |
| signature block. Common blocks are visible by all Fortran codes linked | |
| with the current extension module, but not to other extension modules | |
| (this restriction is due to how Python imports shared libraries). In | |
| Python, the F2PY wrappers to ``common`` blocks are ``fortran`` type | |
| objects that have (dynamic) attributes related to data members of | |
| common blocks. When accessed, these attributes return as Numpy array | |
| objects (multidimensional arrays are Fortran-contiguous) that | |
| directly link to data members in common blocks. Data members can be | |
| changed by direct assignment or by in-place changes to the | |
| corresponding array objects. | |
| Consider the following Fortran 77 code: | |
| .. include:: common.f | |
| :literal: | |
| and wrap it using ``f2py -c -m common common.f``. | |
| In Python: | |
| .. include:: common_session.dat | |
| :literal: | |
| Fortran 90 module data | |
| ======================= | |
| The F2PY interface to Fortran 90 module data is similar to Fortran 77 | |
| common blocks. | |
| Consider the following Fortran 90 code: | |
| .. include:: moddata.f90 | |
| :literal: | |
| and wrap it using ``f2py -c -m moddata moddata.f90``. | |
| In Python: | |
| .. include:: moddata_session.dat | |
| :literal: | |
| Allocatable arrays | |
| ------------------- | |
| F2PY has basic support for Fortran 90 module allocatable arrays. | |
| Consider the following Fortran 90 code: | |
| .. include:: allocarr.f90 | |
| :literal: | |
| and wrap it using ``f2py -c -m allocarr allocarr.f90``. | |
| In Python: | |
| .. include:: allocarr_session.dat | |
| :literal: | |