Il semble que j'ai trouvé une solution. Tout d'abord, l'erreur signalée ne se déclenche que lorsque des tableaux d'entiers sont transmis au sous-programme Fortran. Les valeurs entières et les tableaux réels (je suppose, les valeurs aussi) passent correctement, quand j'utilise Python int et float par défaut, alors que dans Fortran je les déclare comme INTEGER * 4 et REAL * 8. Mais dans le cas des tableaux entiers, cela n'a pas fonctionné. Des corrections mineures sont nécessaires, à savoir, les tableaux d'entiers en Python doivent être déclarés comme (ou convertis en) type np.int32 et déclarés comme INTEGER * 4 dans le sous-programme Fortran. Voici des exemples de déclaration/conversion de tableau qui ont fonctionné dans mon projet.
Python:
import numpy as np
import Fortran_file
#.... some code
# variable "data" is integer 2-D array
data = data.astype(np.int32) # data.astype(int) gives error
data = np.asfortranarray(data)
array1 = np.zeros(5, dtype=np.int32, order='F') # dtype=int gives error
array2 = np.zeros(5, dtype=float, order='F')
ivalue = 2 # conversion to np.int32 is not needed
Fortran_file.Fortran_subroutine(data, ivalue, array1, array2)
Fortran:
SUBROUTINE Fortran_subroutine (matrix, value, array1, array2)
IMPLICIT NONE
INTEGER*4 :: matrix(:,:)
!f2py INTENT(INOUT) :: matrix(:,:)
INTEGER*4 :: value
!f2py INTENT(INOUT) :: value
INTEGER*4 :: array1(5)
!f2py INTENT(INOUT):: array1(5)
REAL*8 :: array2(5)
!f2py INTENT(INOUT) :: array2(5)
Encore une fois, cela a eu sens sur OS 64 bits. Lorsque j'ai utilisé un système d'exploitation 32 bits, tout fonctionnait sans ces astuces.
Je n'ai pas expérimenté avec d'autres types de données.