J'utilise f2py
pour générer un wrapper pour une bibliothèque MPI écrite en fortran. En raison du schéma de partitionnement des tableaux que j'utilise, il est possible pour un processus d'avoir un tableau local avec une longueur de 0, s'il y a suffisamment de processus MPI. Cela déclenche l'erreur suivante sur le système Cray auquel j'ai accès :
ValueError: failed to create intent(cache|hide)|optional array--
must have defined dimensions but got (0,)
Je ne reçois pas la même erreur sur mon bureau. C'est probablement lié aux versions de python et de numpy que j'ai installées. Sur mon bureau, il s'agit de la version 1.16.4 de numpy et de la version 2.7.15+ de python, et sur le cluster, il s'agit de la version 1.13.3 de numpy et de la version 2.7.14 de python. Comme je ne peux pas mettre à jour les paquets sur le cluster, je me demande s'il existe une solution de contournement simple. Le code suivant reproduit l'erreur :
Fichier 'fortran_sub.f90' :
subroutine sub(a_size, a)
integer, intent(in) :: a_size
real, dimension(a_size), intent(out) :: a
if (size(a) > 0) then
a = size(a)
endif
end subroutine sub
Enveloppé et compilé à l'aide de f2py comme suit :
python2 -m numpy.f2py -h --overwrite-signature fortran_sub.pyf -m
fortran_sub fortran_sub.f90
python2 -m numpy.f2py --f90exec="ftn" -c fortran_sub.pyf -m
fortran_sub fortran_sub.f90
Le fichier .pyf généré est le suivant :
! -*- f90 -*-
! Note: the context of this file is case sensitive.
python module fortran_sub ! in
interface ! in :fortran_sub
subroutine sub(a_size,a) ! in :fortran_sub:fortran_sub.f90
integer intent(in) :: a_size
real dimension(a_size),intent(out),depend(a_size) :: a
end subroutine sub
end interface
end python module fortran_sub
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
Exécution du programme python suivant 'pytest.py' avec python2 pytest.py :
import fortran_sub
a = fortran_sub.sub(2)
print(a)
a = fortran_sub.sub(1)
print(a)
a = fortran_sub.sub(0)
print(a)
J'obtiens le résultat suivant :
[ 2. 2.]
[ 1.]
Traceback (most recent call last):
File "pytest.py", line 11, in <module>
a = fortran_sub.sub(0)
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (0,)