2012-11-19 37 views
5

Giả sử chúng ta cần gọi hàm fortran, trả về một số giá trị, trong chương trình python. Tôi phát hiện ra rằng viết lại mã Fortran theo cách như vậy:làm cho bạn bè trăn và fortran

subroutine pow2(in_x, out_x) 
     implicit none 
     real, intent(in)  :: in_x 
!f2py real, intent(in, out) :: out_x 
     real, intent(out)  :: out_x 
     out_x = in_x ** 2 
     return 
end 

và gọi đó là trong python theo cách như vậy:

import modulename 
a = 2.0 
b = 0.0 
b = modulename.pow2(a, b) 

cho chúng ta kết quả làm việc. Tôi có thể gọi chức năng fortran theo cách khác, vì tôi nghĩ cách đầu tiên hơi vụng về?

+0

Cân nhắc sử dụng IPython? – inspectorG4dget

+0

Làm thế nào nó có thể giúp tôi? Theo như tôi biết đó là loại chế độ tương tác được nâng cấp. – user983302

+1

Nó cũng cho phép bạn giao tiếp với các chương trình khác như R, MATLAB, và FORTRAN. Xem [video này] (http://pyvideo.org/video/1605/science-and-python-retrospective-of-a-mostly-s) – inspectorG4dget

Trả lời

10

Tôi nghĩ rằng bạn chỉ cần thay đổi f2py chức năng chữ ký của bạn một chút (để out_x chỉ intent(out)in_x chỉ intent(in)):

subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    !f2py real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    !f2py real, intent(out) :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

Bây giờ biên dịch:

f2py -m test -c test.f90 

Bây giờ chạy:

>>> import test 
>>> test.pow2(3) #only need to pass intent(in) parameters :-) 
9.0 
>>> 

Lưu ý rằng trong trường hợp này, f2py có thể quét một cách chính xác các chữ ký của hàm mà không đặc biệt !f2py nhận xét:

!test2.f90 
subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

Compile:

f2py -m test2 -c test2.f90 

chạy:

>>> import test2 
>>> test2.pow2(3) #only need to pass intent(in) parameters :-) 
9.0 
>>> 
+0

Thật tuyệt vời! Bằng cách này thậm chí có thể trả về nhiều biến trong tuple! Chỉ vì sự tò mò của tôi nếu có một số thủ đoạn khác tôi sẽ không đánh dấu câu trả lời này ngay bây giờ. – user983302

+0

Tôi thường xuyên bị ấn tượng bởi cách dễ dàng để quấn mã fortran bằng 'f2py'. Bởi vì điều đó, tôi chưa bao giờ bận tâm để tìm hiểu bất kỳ của python C API hoặc thậm chí 'Cython' mặc dù tại một số điểm tôi muốn nhận những kỹ năng. – mgilson

0

Một lợi ích khác đối với avoi ding intent(inout) đối số là (với một vài hạn chế khác) hàm kết quả can be considered PURE. Điều này liên quan đến cách tiếp cận không có tác dụng phụ được thực hiện bởi các ngôn ngữ chức năng và trả hết với tối ưu hóa tốt hơn và phát hiện lỗi của trình biên dịch Fortran và đặc biệt quan trọng cho việc tự động song song.

0

Nếu bạn đang sử dụng IPython, hãy thử lệnh ma thuật, mà làm cho nó có thể viết

%%fortran 
subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

và sau đó chỉ cần sử dụng chức năng này trong mã của bạn (không có hàng nhập khẩu bổ sung).

Các vấn đề liên quan