从外部子例程访问主程序中的变量



我正在尝试使用 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

最新更新