Come si crea un modulo python da un programma FORTRAN con f2py?
Domanda
Sto cercando di leggere alcuni file SMPS con Python, e ho trovato un'implementazione FORTRAN, così ho pensato di dare f2py un colpo. Il problema è che non ho alcuna esperienza con FORTRAN.
Ho installato con successo gfortran e f2py sulla mia macchina Linux e corse l'esempio a pagina f2py Thew, ma ho qualche difficoltà a compilare ed eseguire il programma di grandi dimensioni. Ci sono due file, uno con un involucro lettore di file e uno con tutta la logica. Sembrano chiamare l'un l'altro, ma quando compilo e link o provo f2py, ottengo gli errori che in qualche modo non riescono a trovare un l'altro:
f95 -c FILEWR~1.F
f95 -c SMPSREAD.F90
f95 -o smpsread SMPSREAD.o FILEWR~1.o
FILEWR~1.o In function `file_wrapper_'
FILEWR~1.F(.text+0x3d) undefined reference to `chopen_'
usrlibgcci486-linux-gnu4.4.1libgfortranbegin.a(fmain.o) In function `main'
(.text+0x27) undefined reference to `MAIN__'
collect2 ld returned 1 exit status
Inoltre ho provato a cambiare il nome in FILE_WRAPPER.F, ma che non ha aiutato.
Con f2py ho scoperto che ho dovuto includere un commento per farlo accettare formato libero, e salvato questo come un nuovo file e provato:
f2py -c -m smpsread smpsread.f90
Ho un sacco di uscita e le avvertenze, ma l'errore sembra essere questa:
getctype: No C-type found in "{'typespec': 'type', 'attrspec': ['allocatable'], 'typename': 'node', 'dimension': [':']}", assuming void.
Il FORTRAN lettore 90 SPM può essere trovato qui .
Qualsiasi aiuto o suggerimenti apprezzato.
Soluzione
Vorrei suggerire saltare il business FORTRAN del tutto.
http://myweb.dal.ca/gassmann/smps2.htm
Il tracciato record MPS è descritto qui, e sembra relativamente semplice da scegliere a parte in Python.
http://myweb.dal.ca/gassmann/smps2.htm#CoreMPSline
Si dovrà definire le classi Python appropriate (o namedtuples) per tutti i dati in ogni caso.
Non credo che il Fortran sta aiutando.