Цель: Научиться превращать написанные на Фортране подпрограммы в питоновские модули
Средства: 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, "пропадание" функций в собраном модуле и др. ). Новые "открытия" буду выкладывать сюда же по мере их обнаружения.
Подписаться на:
Комментарии к сообщению (Atom)
Как перевести 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...
-
Задача: Поставить компилятор fortran-а на компьютер/ноутбук с операционной системой Windows7 (на 64 разрядную) Методы решения: Geany, CVF...
-
Задача: Получить значения p-квантиля данного массива Методы решения: python, scipy, numpy Значения квантиля (в зарубежных источниках ча...
-
Цель: Есть файл в формате netCDF. Хочется получить карту какой-либо гидрометеорологической величины за какой-нибудь временной срез в Window...
Ссылка scipy.org/F2PY_Windows не работает и mingw кажется несколько устаревшим.
ОтветитьУдалить