从Fortran 90中的文件中读取函数

时间:2012-03-09 20:38:13

标签: fortran fortran90

我在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修改文件,但我想在其他文件中修改它。

非常感谢!

3 个答案:

答案 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)

您也可以尝试在程序中使用模块。有时,当您将特殊变量传递给子例程/函数时,您需要为它们编写接口。使用模块将改善您的程序结构,您将更有效,并且所有接口都将自动生成。