2016-10-17 2 views
1
  • OS Ubuntu 14.04 sur ordinateur portable 64 bits
  • je compile une fonction écrite dans le code Fortran en utilisant f2py
  • j'appelle cette fonction de Python.

Et je reçois un message d'erreur: ValueError: Échec d'initialisation intention (inout) tableau - attendu elsize = 4, mais a obtenu 8erreur f2py mal de elsize

Il ressemble à mon code Fortran est compilé en tant que 32 bits malgré la machine 64 bits. Sur un ordinateur 32 bits, tout fonctionne correctement. Qu'est-ce que je fais de mal?

Répondre

0

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.