3

run() と dudt(u, t, ...) という 2 つの Python 関数を含むコードがあります。run は、C 関数 odepack_odeint を呼び出します。これは、Fortran サブルーチン LSODA を呼び出します。LSODA は、dudt を呼び出す別の C 関数 ode_function を呼び出します。dudt にエラーがある場合、PyErr_Print() を使用して ode_function で出力できますが、コードに実行を停止するように指示する方法がわかりません。私は試した、

PyErr_Print()
PyErr_SetString(errobj, message)

ode_function で、しかし、コード segfaults。私が理解しているように、次に起こることは、ode_function が NULL か -1 か何かを返すことです。ただし、LSODA は ode_function が void であることを想定しています。

これは、私が以前に尋ねたこの質問に基づいて、scipy.integrate.odeint にパッチを適用する試みです。

4

1 に答える 1

0

pv on this Github issue for Scipyは、問題が何であるかを説明しました。要するに、C の setjump() と longjump() は原則としてこれを行うことができますが、これはエラーが発生しやすく、特にスレッドセーフではありません。これは、他の同様のアプリケーションでも使用できる可能性がありますが、一般に、Fortran コードを Python と通信させるには、f2py を使用する方が適切な方法です。

于 2013-06-25T16:13:42.000 に答える