从外部子程序访问主程序中的变量
问题描述:
我试图解决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
答
如何写你的模块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
既然你已经使用*相关*模块'maximum_likelihood'既不'funct'也不'hess'应该是(重新)宣布作为'external'。我不认为这回答你的问题,但你应该修复它。此外,我不认为你对'e04lbf'的调用是对该NAG例程的恰当调用。也许你所展示的过于“伪”...... –
感谢您的留言@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