Функция чтения из файла в Fortran 90

У меня есть решатель оптимизации на 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)" из внешнего файла или хотя бы из подпрограммы.

Это возможно? (Я новичок в Фортране.)

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

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


person Alejandro Ll.    schedule 09.03.2012    source источник
comment
Не совсем уверен, что вы хотите позвонить откуда?   -  person haraldkl    schedule 10.03.2012
comment
Также не совсем уверен: вы хотите изменить функцию до или после компиляции? В Fortran вы не можете изменить исходный файл после компиляции.   -  person max    schedule 11.03.2012


Ответы (3)


Конечно. Использовать:

include 'file.inc'

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

person milancurcic    schedule 09.03.2012

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

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)

person mgilson    schedule 12.03.2012

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

person Hossein Talebi    schedule 27.03.2012