2017-04-01 82 views
1

我试图解决Fortran中使用NAG优化库的最大似然问题,但是我遇到了访问外部子程序函数和hess中主程序变量的问题(请参阅下面的伪代码)。考虑到我无法直接将它们作为参数传递(NAG库的限制),将主程序中的变量(例如b)传递给此类例程的最佳方式是什么?我试图实现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 
+2

既然你已经使用*相关*模块'maximum_likelihood'既不'funct'也不'hess'应该是(重新)宣布作为'external'。我不认为这回答你的问题,但你应该修复它。此外,我不认为你对'e04lbf'的调用是对该NAG例程的恰当调用。也许你所展示的过于“伪”...... –

+0

感谢您的留言@HighPerformanceMark;我对Fortran编程颇为陌生。我想我可以安全地放弃在我的主程序中与maximum_likelihood模块的使用关联。对NAG例程的完整(适当)调用是:'CALL E04LBF(n,funct,hess,monit,iprint,maxcal,eta,xtol,stepmx,ibound,bl,bu,x,hesl,hesd,istate,f ,g,iw,liw,w,lw,ifail)。 – Sebastiaan

回答

1

如何写你的模块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