我在Fortran 90中有一个优化求解器。所以,如果我想改变目标函数 我必须修改主文件并以这种方式编写目标函数:
subroutine fobj(n,x,f)
implicit none
integer :: n
real(8) :: f
real(8) :: x(n)
intent(in ) :: n,x
intent(out) :: f
!OBJECTIVE FUNCTION
f = x(1)**2-x(2)+2*x(3)
end subroutine fobj
我有一个很大的目标函数,所以我想从外部文件或至少是subrutine中调用这行“f = x(1)** 2-x(2)+ 2 * x(3)”。
这可能吗? (我是Fortran的新人。)
我知道我可以用Python修改文件,但我想在其他文件中修改它。
非常感谢!
答案 0 :(得分:3)
不确定。使用:
include 'file.inc'
包含外部文件的源代码。
答案 1 :(得分:2)
我不确定这是否是您要找的,但是:
Fortran还允许您将子例程/函数名称作为子例程/函数调用的实际参数传递。相应的伪参数必须具有“外部”属性。
subroutine fobj(n,x,f,func)
implicit none
integer :: n
real(8),external :: func
real(8) :: f
real(8) :: x(n)
intent(in ) :: n,x
intent(out) :: f
!OBJECTIVE FUNCTION
f=func(x,n)
end subroutine fobj
function func1(x,n)
implicit none
real(8) func1
integer n
real(8) :: f,x(n)
f = x(1)**2-x(2)+2*x(3)
end function func1
function func2(x,n)
implicit none
real(8) func2
integer n
real(8) :: f,x(n)
f = x(1)**2+x(2)+2*x(3)
end function func2
program main
real(8),external :: func1,func2
real(8),allocatable :: x(:)
real(8) :: f
integer n
n=50
allocate(x(n))
x=10. !Set X to a known value
call fobj(n,x,f,func1) !Call func1
print*,f !10**2-10+2*10 = 110
x=10. !Reset X ... just to make sure there is no funny business in func1,func2
call fobj(n,x,f,func2) !Call func2
print*,f !10**2+10+2*10 = 130
deallocate(x)
end program main
当然,除了以晦涩的方式调用func1和func2之外,这个程序没有任何用处,但希望它说明了这一点。如果你想在编译时切换掉这个函数,那么我认为include "myfile"
可能更清晰(只需按照@AlejandroLL的建议切换你当时包含的文件)
答案 2 :(得分:2)
您也可以尝试在程序中使用模块。有时,当您将特殊变量传递给子例程/函数时,您需要为它们编写接口。使用模块将改善您的程序结构,您将更有效,并且所有接口都将自动生成。