python fortran f2py

python - f2py dando "redefinición de ''foo''... la definición previa estaba aquí"



fortran (1)

esta es mi primera pregunta, así que sé amable conmigo.

Estoy usando f2py de numpy 1.6.1. Tengo un módulo Fortran que contiene varias subrutinas que compilan (y funcionan) muy bien. Sin embargo, uno de ellos usa la función erf (x) que es una extensión de GNU. No es lo suficientemente preciso para mis propósitos, así que estoy tratando de usar una implementación erf externa.

Estoy tratando de usar uno de Recetas Numéricas en Fortran 77, donde he copiado todas las funciones relevantes en un archivo llamado ''erf.f'' en la misma carpeta que mi módulo. Yo uso include ''erf.f'' en la parte superior de mi archivo de módulo. El nombre real de la función erf cambié a ''derf'', por lo que no entra en conflicto con la extensión gfortran erf.

Sin embargo, cuando intento compilar a través de f2py, cada función foo en ''erf.f'' recibe el error

error: redefinición del error ''foo'': la definición anterior de ''foo'' estaba aquí

Cuando miro el archivo c que se menciona para contener la redefinición y la definición anterior, parece que la función está allí dos veces. Simplemente no sé por qué?

Sabe alguien cómo arreglar esto? Aclamaciones.

EDITAR: No mencioné (como pensé que era información adicional innecesaria) que f2py está siendo utilizado por numpy distutils para crear la extensión. La razón por la que lo menciono ahora es porque creo que puedo crear la extensión fina con el f2py -c my_module.f90 -m mod , pero cuando python setup.py install recibo el error que python setup.py install anteriormente. Entonces, ¿qué hace f2py de manera diferente cuando se ejecuta a través de distutils?

EDIT # 2: si pongo todos los contenidos del archivo externo de la función erf en el mismo archivo que mi módulo, entonces todo funciona. Realmente no quiero hacer esto porque mirando hacia el futuro voy a tener una monstruosidad de un archivo, pero funcionará por ahora hasta que obtenga una respuesta a esta pregunta.


Una solución sería crear un módulo erf.f90 e importarlo en su código principal utilizando use erf (o cualquiera que sea su nombre).

He tenido algunos problemas extraños con los módulos de importación f2py nombrados con una extensión .f , es posible que pueda hacer que funcione simplemente cambiando el nombre de erf.f a erf.f90 y especificando -ffixed-form cuando compila con gfortran .

EDITAR:

Si importa el módulo usando use , no necesita usar también include . include básicamente el código real de erf.f en la fuente de su código principal (aunque como ha notado, no se comporta exactamente igual que escribiendo erf.f directamente en el archivo principal), mientras que el use le dice al compilador que busca un módulo precompilado.

Descubrí que el use funciona bien para mí cuando trabajo con módulos y f2py . (mi código es básicamente fijo desde Fortran 90). Asumiendo un archivo principal main.f , y un módulo subs.f90 (asegúrese de que hay un module...end module en subs.f90 , usaría la siguiente secuencia para la compilación:

gfortran -ffixed-form -c subs.f90 f2py.py -c -m main -I/path/to/subs /path/to/subs/subs.f90 main.f

Tenga en cuenta que puede necesitar especificar otras opciones para f2py según su sistema. Para mí, con MinGW en Windows, necesito --compiler=mingw32 , ya que f2py no parece poder localizar el compilador de C en caso contrario.