2016-08-19 9 views
9

मुझे एक उदाहरण है कि मुझे here मिला है, मैं एक फोरट्रान कोड उत्पन्न करने का प्रयास करता हूं जो कि एक विशिष्ट रूप से मेल खाने के लिए आवश्यक है। आवश्यक FORTRAN कोड इस (it is based on the FitzHugh–Nagumo model) तरह दिखेगा:समीकरणों की प्रणाली के लिए सिम्पी कोडेजन के साथ फोरट्रान सबराउटिन उत्पन्न करें

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 

मैं SymPy में सही भाव पैदा करने के लिए प्रबंधन, लेकिन मैं समझ नहीं है कि कैसे codegen के साथ आवश्यक कोड उत्पन्न करने के लिए। यहाँ मेरी प्रयास अब तक है:

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] 

लेकिन यह मुझे देता है:

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

मुझे लगता है कि यह चाहता है कि आप इंडेक्सबेसबेस के लिए एक आकृति घोषित करें। लेकिन फिर भी एक समस्या है क्योंकि यह अनुक्रमित वस्तुओं को टेंसर के रूप में पेश करना चाहता है। – asmeurer

+0

हमें वास्तव में कोड प्रिंटर में अंतर्निहित सारांश सम्मेलन को अक्षम करना चाहिए। –

उत्तर

1

आप बस अपने अजगर कोड के भीतर FORTRAN समारोह कॉल करने के लिए की जरूरत है, मैंने पाया कि एक FORTRAN आवरण का उपयोग कर बहुत सरल था अजगर में फोरट्रान कोड को फिर से बनाने की कोशिश करने से, खासकर अगर गोटो का भारी इस्तेमाल होता है।

क्या आपने f2py की कोशिश की है? https://sysbio.ioc.ee/projects/f2py2e/

संबंधित मुद्दे