Hy all,<br><br>As a test case before writing something bigger, I&#39;m trying to write a little Fortran module to compute the average of a array in these 4 cases:<br><br>avg2d_float, avg2d_double<br>avg3d_float, avg3d_double<br>


<br>I want this module to be callable from both Fortran and Python, using f2py.<br>4 Fortran functions have to be written, and a generic Fortran function &#39;avg&#39; overloads its.<br><br>The Fortran module &#39;stat.f90&#39; (containing the functions), a Fortran program &#39;stat_example.f90&#39; and a Python script &#39;stat_example.py&#39; are at the end of the email.<br>

<br>(everything works fine: the compilation, f2py, the execution in Python and in Fortran.)<br><br>My questions are:<br>
<br>- Assumed shape array are not supported by f2py. However, it is much more handy to write in Fortran &#39;avg(array)&#39; than &#39;avg(array,n1,n2,n3)&#39;. Would it be possible to supported it by modifying the signature files?<br>


<br>- Is there a way to avoid to write by hand the &#39;avg&#39; Python function (in example_stat.py) ?<br><br>- Isn&#39;t there no way to declare private the functions: avg2d_float, avg2d_double, avg3d_float,avg3d_double? It&#39;s embarassing its are visible from stat_example.f90.<br>

<br>Uncommenting the lines in the top of the file stat.f90:<br>    !private<br>    !public:: avg<br><br>and running:<br>    f2py -m f90stat -c stat.f90<br><br>give the error:<br>    use stat, only : avg2d_float<br>    Error: Symbol &#39;avg2d_float&#39; referenced at (1) not found in module &#39;stat&#39;<br>

<br>Thanks for any suggestion,<br><br>David<br><br><br>
* to create the Fortran executable:<br>gfortran -c stat.f90<br>gfortran -c stat_example.f90<br>gfortran -o stat_example.x stat.o stat_example.o<br><br>* to create the Python module:<br>f2py -m f90stat -c stat.f90<br>
<br>* The Fortran module is:<br><br>&quot;&quot;&quot;<br>!file stat.f90<br>module stat<br><br>implicit none<br>!private<br>!public:: avg<br><br>interface avg<br>    module procedure avg2d_float, avg2d_double, avg3d_float, avg3d_double<br>


end interface<br><br>contains<br><br>function avg2d_float(array,n1,n2) result(average)<br>
<br>    implicit none<br><br>    real(kind=4):: average<br><br>    integer:: n1,n2<br>    real(kind=4),dimension(n1,n2),intent(in):: array<br><br>    average = sum(array)<br><br>    average = average / n1<br>    average = average / n2<br>


end function avg2d_float<br><br>function avg2d_double(array,n1,n2) result(average)<br>
<br>    implicit none<br><br>    real(kind=8):: average<br><br>    integer:: n1,n2<br>    real(kind=8),dimension(n1,n2),intent(in):: array<br><br>    average = sum(array)<br><br>    average = average / n1<br>    average = average / n2<br>


<br>end function avg2d_double<br><br>function avg3d_float(array,n1,n2,n3) result(average)<br>
<br>    implicit none<br>    real(kind=4):: average<br><br>    integer:: n1,n2,n3<br>    real(kind=4),dimension(n1,n2,n3),intent(in):: array<br><br>    average = sum(array)<br><br>    average = average / n1<br>    average = average / n2<br>


    average = average / n3<br><br>end function avg3d_float<br><br>function avg3d_double(array,n1,n2,n3) result(average)<br>
<br>    implicit none<br><br>    real(kind=8):: average<br><br>    integer:: n1,n2,n3<br>    real(kind=8),dimension(n1,n2,n3),intent(in):: array<br><br>    average = sum(array)<br><br>    average = average / n1<br>    average = average / n2<br>


    average = average / n3<br><br>end function avg3d_double<br><br>end module stat<br>&quot;&quot;&quot;<br><br>* The Fortran program is:<br><br>&quot;&quot;&quot;<br>!file: stat_example.f90<br>
program stat_example<br><br>use stat<br>implicit none<br><br>integer,parameter:: n1=10,n2=10,n3=10<br>real(kind=4),dimension(n1,n2):: array2d_float<br>real(kind=8),dimension(n1,n2):: array2d_double<br><br>real(kind=4),dimension(n1,n2,n3):: array3d_float<br>


real(kind=8),dimension(n1,n2,n3):: array3d_double<br><br>array2d_float = 4.<br>array2d_double = 4.<br><br>array3d_float = 4.<br>array3d_double = 4.<br><br>write(*,*) avg(array2d_float,n1,n2)<br>write(*,*) avg(array2d_double,n1,n2)<br>


<br>write(*,*) avg(array3d_float,n1,n2,n3)<br>write(*,*) avg(array3d_double,n1,n2,n3)<br><br>write(*,*) avg2d_float(array2d_float,n1,n2)<br><br>end program stat_example<br>&quot;&quot;&quot;<br><br>* The Python script is:<br>


<br>&quot;&quot;&quot;<br>#!/usr/bin/env python<br><br>#file stat_example.py<br><br>import numpy as np<br>import f90stat<br><br>def avg(a):<br><br>    if a.ndim == 2:<br>        if a.dtype == &#39;float32&#39;:<br>
            return f90stat.stat.avg2d_float(a)<br><br>        elif a.dtype == &#39;float64&#39; :<br>            return f90stat.stat.avg2d_double(a)<br><br>        else:<br>            raise ValueError, &#39;dtype = %r unsupported.&#39; % (a.dtype)<br>


<br>    elif a.ndim == 3:<br>        if a.dtype == &#39;float32&#39;:<br>            return f90stat.stat.avg3d_float(a)<br><br>        elif a.dtype == &#39;float64&#39; :<br>            return f90stat.stat.avg3d_double(a)<br>


<br>        else:<br>            raise ValueError, &#39;dtype = %r unsupported.&#39; % (a.dtype)<br><br>    else:<br>        raise ValueError, &#39;ndim = %r unsupported.&#39; % (a.ndim)<br><br>if __name__ == &#39;__main__&#39;:<br>


<br>    a = np.arange(6.)<br>    a = a.reshape(2,3)<br><br>    print avg(a)<br>&quot;&quot;&quot;<br><br>