Функция чтения из файла в Fortran 90 - PullRequest
0 голосов
/ 10 марта 2012

У меня есть решатель оптимизации в 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

У меня естьбольшая целевая функция, поэтому я хочу назвать эту строку "f = x (1) ** 2-x (2) + 2 * x (3)" из внешнего файла или хотя бы подпрограммы.

Это возможно?(Я новичок в Fortran.)

Я знаю, что могу изменить файл с помощью Python, но я хочу сделать это в другом файле.

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 10 марта 2012

Конечно.Используйте:

include 'file.inc'

для включения исходного кода из внешнего файла.

2 голосов
/ 27 марта 2012

Вы также можете попробовать использовать модули в своей программе.Иногда, когда вы передаете специальные переменные вашим подпрограммам / функциям, вам нужно написать интерфейсы для них.Использование модулей улучшит структуру вашей программы, и вы будете более эффективны, и все интерфейсы будут созданы автоматически.

2 голосов
/ 13 марта 2012

Я не уверен, что это то, что вы ищете, но:

Fortran также позволяет вам передавать имена подпрограмм / функций как фактические аргументы для вызовов подпрограмм / функций.Соответствующие фиктивные аргументы должны иметь атрибут "external".

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)

...