2012-03-09 3 views
0

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

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

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

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

+0

Не совсем уверен, что вы хотите позвонить откуда? – haraldkl

+0

Не совсем уверен: хотите ли вы модифицировать функцию до или после компиляции? В Fortran вы не можете модифицировать исходный файл после компиляции. – max

ответ

3

Несомненно. Использование:

include 'file.inc' 

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

+0

Спасибо, что работает! –

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

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