суббота, 18 февраля 2012 г.

"Обёртка" Питона для Фотрана или F2PY using Windows

Цель: Научиться превращать написанные на Фортране подпрограммы в питоновские модули
Средства: Python, Numpy, MinGw

У Николая Колдунова есть прекрасный пост о модуле для питона (python) F2PY: F2PY – ускоряем вычисления в Питоне в 500 раз . Там очень хорошо изложено как соединить функционал языка программирования Питона и наработки (в виде подпрограмм и функций) в Фортране.
Однако Колдунов описывает процесс установки и работы f2py под Linux ОС. Я же хочу поделиться опытом использования f2py (очень базовый уровень) под Windows 7 ОС.

Итак, на сайте Scipy.org - F2PY_Windows есть инструкция на английском языке "F2py для Windows". Пройдём её вместе.


Шаг 1. Устанавливаем Питон версии 2* (не 3*!). Берём здесь python windows installer и устанавливаем всё в корневой каталог (например, c:\Python27). Я использую версию питона 2.6 - с ней хорошо взаимодействуют многие модули (pygame, matplotlib, numpy, basemap, scipy и др.).

Шаг 2. Устанавливаем поверх выбранной версии интерпретатора Питона (2.6 у меня) модуль-расширение NumPy, в котором, собственно,  и лежит f2py.py. Просто запускаем .exe файл (смотрим, чтобы версия питона была не ниже заявленной в NumPy)

Шаг 3. Устанавливаем компилятор фортрана из MinGw. Если у Вас он уже стоит на компьютере, то обращаю Ваше внимание: в примечании к этому шагу ОЧЕНЬ правильно написано о том, что при установке в папку "Program Files" или похожую ("Program Files (x86)") может быть некорректное взаимодействие gfortran и f2py! (Пере-) Устанавливайте, как и рекомендуется, в корневой каталог, например "C:\MinGw"! Взять gortran из MinGw можно тут (gfortran MinGw).

На этом же шаге прописываем пути в переменных среды:
  а) для MinGw (привет Geany IDE!) : "PATH" - "c:\MinGw\bin"
+ PATH позволяет Geany IDE подцепить gortran!
  б) для корректной работы f2py c gfortran нужно указать путь переменной "C_INCLUDE_PATH" к папке MinGw\include, т.е. : "C_INCLUDE_PATH" - "c:\MinGw\include"
  в) для интерпретатора Питона: "PATH" - "c:\Python26\"
+ и теперь Питон можно запускать в  Geany! =)

Шаг 4. Перезагружаем компьютер, чтобы новые переменные среды активировались

С установкой всё. Дальше - уже программирование. Необходимо собрать модуль "f2py_test_module.pyd" из программы ftest.f90. Приведу пример с преобразованием функции расчета СКО (она же "сигма", std/rmse) для двух массивов длины n.


Исходный фортрановский код (Fortran source code) сохраняем под именем "ftest.f90":

------------------------------------------------------------------------------------------------------------
function rmse(m,o,n)

integer n
real      m(n),o(n),s,r

! This function computes RMSE (root mean squared error or
! root mean squared deviation) value from m & o arrays.
!
! Root mean-squared error (RMSE) is very commonly
! used as a measure of deviation from the observed
! value. Although is has been criticized as being ambiguous
! [Willmott and Matsuura, 2006] and its dependence on the
! squared error means that it is not resistant to outliers
! deviating from a Gaussian distribution. We include it
! because of its familiarity and, like CRE, its sensitivity to
! large outliers

s = 0.0

do i = 1,n
  r = m(i) - o(i)
  s = s + r*r
enddo

s = s/(real(n))

rmse = sqrt(s)

return

end function
------------------------------------------------------------------------------------------------------------
Затем можно в командной строке (cmd) (а можно в Total Commander) в папке, где лежит файл  ftest.f90, набираем следующее:

python c:\Python26\Scripts\f2py.py -c --fcompiler=gfortran --compiler=mingw32 -lmsvcr71 -m f2py_test_module ftest.f90

В этой же папке должен появиться файл "f2py_test_module.pyd".
Если всё прошло успешно, и модуль *.pyd получен, то можно уже писать программу на Питоне. Назовём её, например, "Py_fortran.py":
------------------------------------------------------------------------------------------------------------
import numpy as np
import f2py_test_module

print f2py_test_module.__doc__ # Напечатает функции, которые есть в данном модуле

# Формируем с помощью NumPy два массива длиной в 10 элементов
# В Питоне нумерация членов массивов начинается с нуля, а не с 1, как в Фортране!!!

a = np.arange(0,10,1)
b = np.arange(0,100,10)
n = 10

# Печатаем СКО

print 'Rmse= ', f2py_test_module.rmse(a,b,n)
------------------------------------------------------------------------------------------------------------

Запускаем и получаем результат на экране =).

Я привёл пример использования простой функции. Может быть, для более сложных вещей найдутся другие трудности (несовместимость версий gfortran-a и f2py, "пропадание" функций в собраном модуле и др. ). Новые "открытия" буду выкладывать сюда же по мере их обнаружения.


1 комментарий:

  1. Ссылка scipy.org/F2PY_Windows не работает и mingw кажется несколько устаревшим.

    ОтветитьУдалить

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...