問題
関数を別の関数の引数にしようとしていますが、エラーが発生し続けます:
Error: Internal procedure 'polytrope' is not allowed as an actual argument at (1)
コード
以下は、関数を呼び出し、実際のコールバックを含むプログラムのベアボーン バージョンです。
PROGRAM testbutcher
USE butcher
IMPLICIT NONE
REAL :: t = 0, dt = 0.01
REAL, DIMENSION(2) :: v0 = (/ 1.0, 0.0 /), fargs = (/ 1.0, 1.0 /)
v0 = step(polytrope, v0, 2, t, dt, fargs)
CONTAINS
FUNCTION polytrope(v0, t, fargs) result(v1)
REAL, DIMENSION(:) :: fargs
REAL, DIMENSION(2) :: v0, v1
REAL :: t
v1 = t * v0
RETURN
END FUNCTION
END PROGRAM
次に、関数引数を取る関数が次のモジュールです。
MODULE butcher
IMPLICIT NONE
CONTAINS
FUNCTION step(fxn, v0, n, t, dt, fargs) RESULT(v1)
REAL, DIMENSION(n) :: v0, v1
REAL, DIMENSION(:) :: fargs
REAL, DIMENSION(tn,tm) :: tab
REAL :: t, dt
INTEGER :: n, tn, tm
INTERFACE
FUNCTION fxn(v, t, fargs)
REAL, DIMENSION(:), INTENT(in) :: v
REAL, DIMENSION(:), INTENT(in) :: fargs
REAL, INTENT(in) :: t
END FUNCTION
END INTERFACE
v1 = fxn( v0, &
t + dt, &
fargs &
)
RETURN
END FUNCTION
END MODULE
概要
したがって、基本的に、testbutcher には特別な方法で評価される関数が含まれているため、モジュール butcher (具体的には butcher の関数ステップ) に送信して評価されます。これを実際に行う方法がわかりません!私が C で作業していた場合、単純に polytrope へのポインターを作成し、それを fxn にスローします。