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]
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
Kod yazıcısında örtülü toplama kuralını gerçekten devre dışı bırakmalıyız. –