このスレッドを開始して、関数インターフェイスの間違った仕様に起因する可能性のある問題を解決するための支援を求めていますが、修正方法がわかりません。
私が遭遇したエラーメッセージは短く、「lnsrch への引数の数または型が不正です - fmin と func の引数が一致しません。」という短いものです。
、 、およびの定義はLNSRCH
、以下の内容で明確になります。FMIN
FUNC
以下に示すように、元のプログラム コードは、私の意図を説明するためにトリミングされています。MAIN
これは、 というメイン プログラム ユニット、 という名前のモジュールMODEL
、および という名前のモジュールの 3 つの部分で構成されますNEWTON
。次の .f90 形式のファイルを 1 つ使用するだけで、エラー メッセージを再現できるはずです。
モジュールMODEL
は単純な方程式系を 2 つの変数で定義するだけです ---y(1)=x(1); y(2)=x(2) --- サブプログラム内FUNC_SYSTEM1
。モジュールには、将来の拡張用の抽象インターフェイスも含まれているため、現在の例の方程式システムと同じ種類の他の方程式システムを参照MODEL
するポインターを簡単に作成できますが、方程式システムの変数の数だけが例外です。FUNCV
FUNC_SYSTEM1
MODULE model
IMPLICIT NONE
REAL, DIMENSION(:), POINTER :: fmin_fvecp
ABSTRACT INTERFACE
FUNCTION function_system_template(x) RESULT(y)
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(SIZE(x)) :: y
END FUNCTION
END INTERFACE
PROCEDURE(function_system_template), POINTER :: funcv
CONTAINS
FUNCTION func_system1(x) Result(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(size(x)) :: y
y(1)=x(1)
y(2)=x(2)
END FUNCTION func_system1
END MODULE model
モジュールNEWTON
は、プログラムの計算の鍵となる 3 つのサブプログラム間の関係を定義しBROYDEN
ますFMIN
。同時に、 ではFMIN
、x(1) と x(2) のベクトルが という配列ポインターに割り当てられますFMIN_FVECP
。この配列ポインタは、関数内で副次的な計算を行うために使用されますLNSRCH
。
MODULE newton
USE model
IMPLICIT NONE
REAL, DIMENSION(:), POINTER :: fmin_fvecp
CONTAINS
SUBROUTINE broyden(x,fmin_fvecp,funcv)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(size(x)), TARGET :: y
REAL, DIMENSION(:), POINTER :: fmin_fvecp
PROCEDURE(function_system_template), POINTER :: funcv
fmin_fvecp=>y
print*,fmin(x,fmin_fvecp,funcv) ! Get the sum of squares
print*,fmin_fvecp ! Show the vector x(1) and x(2)
print*,lnsrch(x,fmin,fmin_fvecp,funcv) ! Show the figure calculated in LNSRCH
END SUBROUTINE broyden
FUNCTION fmin(x,fmin_fvecp,funcv) RESULT(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(:), POINTER :: fmin_fvecp
PROCEDURE(function_system_template), POINTER :: funcv
REAL :: y
fmin_fvecp=funcv(x) ! The value of FMIN_FVECP is assigend
fmin=dot_product(fmin_fvecp,fmin_fvecp)! when FMIN is called by BROYDEN
END FUNCTION fmin
FUNCTION lnsrch(x,func,a_fvecp,b_funcv) RESULT(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(:), POINTER :: a_fvecp
PROCEDURE(function_system_template), POINTER :: b_funcv
INTERFACE
FUNCTION func(x,fvecp,funcp)
IMPORT :: function_system_template
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL :: func
REAL, DIMENSION(:), POINTER :: fvecp
PROCEDURE(function_system_template), POINTER :: funcp
END FUNCTION
END INTERFACE
REAL, DIMENSION(SIZE(x)) :: y
y=x+a_fvecp+b_funcv(x)+1000.
END FUNCTION lnsrch
END MODULE newton
主プログラム単位は次のように定義されます。
PROGRAM main
USE model
USE newton
IMPLICIT NONE
REAL, DIMENSION(:), allocatable :: x
allocate(x(2))
x=[1.,2.] ! The input arguments to be passed into
funcv=>func_system1 ! the equation system, FUNC_SYSTEM1.
call broyden(x,fmin_fvecp,funcv) ! Call BROYDEN to do the subsequent calcualtion
deallocate(x)
END PROGRAM main
長い投稿で申し訳ありません。私の質問を読んでくれてありがとう。エラーメッセージを回避するための入力を楽しみにしています。ありがとう。
リー