Ohm*_*Ohm 9 python code-generation sympy python-2.7 codegen
基于我在这里找到的前一个例子,我试图找出如何生成一个Fortran代码,该代码对应于我需要坚持的特定形式.所需的FORTRAN代码将如下所示(它基于FitzHugh-Nagumo模型):
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
Run Code Online (Sandbox Code Playgroud)
我设法在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]
Run Code Online (Sandbox Code Playgroud)
但它给了我:
IndexException:
Range is not defined for all indices in: PAR[3]
Run Code Online (Sandbox Code Playgroud)
小智 1
如果您只需要在 python 代码中调用 FORTRAN 函数,我发现使用 FORTRAN 包装器比尝试在 python 中重新创建 FORTRAN 代码要简单得多,特别是在大量使用 GOTO 的情况下。
你试过f2py吗?https://sysbio.ioc.ee/projects/f2py2e/
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |