【问题标题】:Generate Fortran subroutine with SymPy codegen for a system of equations使用 SymPy codegen 为方程组生成 Fortran 子例程
【发布时间】:2016-12-26 23:17:24
【问题描述】:

在我找到here 的前一个示例的基础上,我尝试找出如何生成与我需要坚持的特定形式相对应的 Fortran 代码。所需的 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]

【问题讨论】:

  • 我认为它希望您为 IndexedBase 声明一个形状。但即使这样也有一个问题,因为它想将索引对象视为张量。
  • 我们应该真正禁用代码打印机中的隐式求和约定。

标签: python python-2.7 code-generation sympy codegen


【解决方案1】:

如果您只需要在 python 代码中调用 FORTRAN 函数,我发现使用 FORTRAN 包装器比尝试在 python 中重新创建 FORTRAN 代码要简单得多,尤其是在大量使用 GOTO 的情况下。

你试过 f2py 吗? https://sysbio.ioc.ee/projects/f2py2e/

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2014-01-14
    • 2012-01-02
    相关资源
    最近更新 更多