2016-08-19 34 views
9

here'u bulduğum eski bir örnek üzerinde yapıyorum, yapmam gereken belirli bir forma karşılık gelen bir Fortran kodunu nasıl oluşturacağımı bulmaya çalışıyorum.Bir denklemler sistemi için SymPy kodlayıcısı ile Fortran alt yordamı oluştur

SUBROUTINE FF(NE,U,PAR,F) 
!  ---------- -- 
!  Define the nonlinear term 

    IMPLICIT NONE 
    INTEGER, INTENT(IN) :: NE 
    DOUBLE PRECISION, INTENT(IN) :: U(NE),PAR(*) 
    DOUBLE PRECISION, INTENT(OUT) :: F(NE) 

    DOUBLE PRECISION u,v,e,a1,a0 

    u=U(1) 
    v=U(2) 
    e=PAR(1) 
    a1=PAR(2) 
    a0=PAR(3) 

    F(1)= u-u**3-v 
    F(2)= e*(u-a1*v-a0) 

    END SUBROUTINE FF 

Ben SymPy doğru ifadeler oluşturmak için yönetmek ama codegen ile gerekli kodu oluşturmak için nasıl çözemedim: Gerekli FORTRAN kod (it is based on the FitzHugh–Nagumo model) gibi görünecektir.

from sympy import symbols,latex 
from sympy.utilities.codegen import codegen 
from sympy.tensor import IndexedBase, Idx 
from sympy import Matrix 
U, PAR = symbols('U PAR', cls=IndexedBase) 

u = U[1] 
v = U[2] 

e = PAR[1] 
a1 = PAR[2] 
a0 = PAR[3] 

dudt = u-u**3-v 
dvdt = e*(u-a1*v-a0) 

print latex(dudt) 
print latex(dvdt) 

F = Matrix([dudt,dvdt]) 
print F 

result = codegen(('my_function', F), 'f95', 'my_project') 
print result[0][1] 

Ama bana verir: İşte benim girişimi şimdiye kadar olduğu

IndexException: 
Range is not defined for all indices in: PAR[3] 
+0

Sanırım IndexedBase için bir şekil bildirmenizi istiyor. Ancak o zaman bile problem var çünkü indeksli nesneleri tensörler olarak kullanmak istiyor. – asmeurer

+0

Kod yazıcısında örtülü toplama kuralını gerçekten devre dışı bırakmalıyız. –

cevap

1

basitçe piton kodu içinde FORTRAN işlevi çağırmak gerekiyorsa, bir FORTRAN sarmalayıcı kullanarak çok daha basit olduğu bulundu Özellikle GOTO'lar çok kullanılıyorsa, Python'da FORTRAN kodunu yeniden oluşturmaya çalışmaktan daha iyidir.

f2py'yi denediniz mi? https://sysbio.ioc.ee/projects/f2py2e/