공학자를 위한 Python 사용법 23
이번에는 FORTRAN으로 짜여져 있는 함수를 python에서 부를수 있게 하는 방법을 알아보겠습니다.
21세기에 무슨 FORTRAN이냐 하는 생각을 가질 수도 있지만, 과거에 많은 수치해석 프로그램이 FORTRAN으로 개발되었고 이 프로그램들이 여전히 여기저기에서 사용되고 있습니다.
하지만 이미 개발이 완성된 함수를 다시 python으로 해석하는 작업은 매우 불필요하고 거추장스러운 일입니다. 이럴때를 위해서 그냥 FORTRAN 함수를 compile해서 일종의 library처럼 만들어 둔 다음 python에서 부르는 방법이 있습니다.
주어진 날짜와 위치에 따른 지구자기장값을 계산해주는 IGRF12 함수를 예제로 사용해보겠습니다. 원래 FORTRAN 프로그램은 여기서 내려받을 수 있습니다.
http://www.ngdc.noaa.gov/IAGA/vmod/igrf12.f
그리고 프로그램에 대한 설명은 여기에서 볼 수 있습니다.
http://www.ngdc.noaa.gov/IAGA/vmod/igrf.html
igrf12.f 내부를 들여다 보면 지구자기장을 계산하는 함수가
subroutine igrf12syn (isv,date,itype,alt,colat,elong,x,y,z,f)
라는 이름으로 되어있고 그 앞에 있는 내용은 이 함수를 실제 불러서 실행하는 부분입니다. 우리는 이 함수를 python에서 부를것이므로 앞부분 내용은 필요없고 이 함수부분만 필요합니다. 그래서, 앞을 다 잘라내고 위의 함수만 포함한 파일을 다음과 같이 만듭니다.
https://gist.githubusercontent.com/myjr52/62ca6ffc3e9c78ea0411/raw/df1ca256826579fe9810b1058ca3c2b57b928611/igrf12.f
한가지 위의 파일에서 내부에 추가된 부분이 있는데... 다음과 같은 내용입니다:
Cf2py intent(out) x Cf2py intent(out) y Cf2py intent(out) z Cf2py intent(out) f
이 부분이 FORTRAN 프로그램을 python에서 부를 수 있는 함수로 바꿔주는 f2py가 작동할때 subroutine igrf12syn에 있는 매개변수 중에 x, y, z, f는 출력변수라는 것을 알려주기 위함입니다.
operating system prompt에서 이제 f2py를 이용해 변형된 igrf12.f를 다음과 같이 compile합니다. (참고로 python을 저처럼 anaconda를 통해 설치했다면 f2py3라는 프로그램이 이미 같이 깔려있을겁니다)
> f2py -c -m igrf12_fortran igrf12.f
-c 는 compile 하라는 뜻이고, -m은 library 만들때 이름을 igrf12_fortran (특별히 다른 이름을 원한다면 여기서 이름을 바꾸면 됩니다)이라고 하라는 뜻입니다. 위를 실행하고나면 어떤 운영시스템을 쓰느냐에 따라 다른데...
linux에서는 igrf12_fortran.cpython-34m.so라는 library가 생겼고
mac os-x에서는 igrf12_fortran.so라는 library가 생겼습니다.
이를 부르는 방법은
>> import igrf12_fortran
한 다음에
>> igrf12_fortran.igrf12syn(.....)
하면 됩니다.
좀 더 프로그램을 간략하게 쓰기 위해서 다음과 같이 python 프로그램을 만들었습니다.
https://gist.githubusercontent.com/myjr52/62ca6ffc3e9c78ea0411/raw/6d8cbc3693f384a3e83f122b7a48155f71fb4b11/igrf12.py
이제는 python에서 다음 순서로 부르면 됩니다.
>> import igrf12
>> igrf12.igrf12(0,2016,2,4000,23,32)
(-1216.8147739252843, 24122.237297648033, 118869.7813460386)
마지막에 나온 3개의 숫자가 지구 자기장의 북쪽, 동쪽, 지구 중심방향 값이 nT로 계산된 것입니다.














