我正在尝试使用 NAG 优化库解决 Fortran 中的最大似然问题,但我在从外部子例程函数和 hess 访问主程序中的变量时遇到了问题(请参阅下面的伪代码(。传递变量的最佳方法是什么(例如 b
( 从主程序到此类例程,因为我不能将它们直接作为参数传递(NAG 库的限制(。我试图实现 COMMON 块,但没有太多成功。
MODULE user_parameters
! Define the user parameters
INTEGER, PARAMETER :: a = 100
... other parameters
END MODULE user_parameters
MODULE process_data
USE user_parameters
! Define some other variables
INTEGER :: b
... other variables
CONTAINS
SUBROUTINE read_data
... read the data (e.g. alter value of b)
END SUBROUTINE read_data
SUBROUTINE clean_data
... clean the data (e.g. alter value of b)
END SUBROUTINE clean_data
END MODULE process_data
MODULE maximum_likelihood
USE user_parameters
USE process_data
CONTAINS
SUBROUTINE funct
... returns the LL's function value and gradient
END SUBROUTINE funct
SUBROUTINE hess
... returns the LL's hessian
END SUBROUTINE hess
END MODULE maximum_likelihood
PROGRAM estimation
USE user_parameters
USE process_data
USE maximum_likelihood
EXTERNAL funct, hess
CALL read_data
CALL clean_data
! Call minimization routine
CALL E04LBF(funct, hess)
END PROGRAM estimation
编写
模块maximum_likelihood
以下内容怎么样?
MODULE maximum_likelihood
IMPLICIT NONE
PRIVATE
PUBLIC init, fin, funct, hess
INTEGER, SAVE :: aa, bb
REAL, DIMENSION(:), ALLOCATABLE, SAVE :: vv
CONTAINS
SUBROUTINE init(aa_arg, bb_arg, vv_arg)
! set values module variables
END SUBROUTINE init
SUBROUTINE fin()
deallocate(vv)
END SUBROUTINE fin
SUBROUTINE funct
... returns the LL's function value and gradient
! using the values of aa, bb, and/or vv
END SUBROUTINE funct
SUBROUTINE hess
... returns the LL's hessian
! using the values of aa, bb, and/or vv
END SUBROUTINE hess
END MODULE maximum_likelihood
然后,主程序将如下所示
PROGRAM estimation
USE maximum_likelihood, ONLY: init, fin, funct, hess
! read values for the parameters aaa, bbb, vvv
! set these values in the module variables in maximum_likelihood
CALL init(aaa, bbb, vvv)
! Call minimization routine
CALL E04LBF(funct, hess)
! clean up the module variables in maximum_likelihood
CALL fin()
END PROGRAM estimation