Sto cercando di utilizzare le routine in QUADPACK
per eseguire l’integrazione numerica. Le routine si aspettano che le funzioni vengano passate come REAL,EXTERNAL
, quindi non ho la libertà di usare i puntatori o qualsiasi altra cosa.
È ansible aliasare una funzione f(x,a,b,...)
come una funzione f(x)
per la routine che si aspetta solo una funzione di x? Molto simile a quello che si otterrebbe in MATLAB
con @(x)f(x,a,b,...)
.
Non è ansible eseguire trucchi simili con funzioni direttamente in Fortran. Inoltre, non puoi restituire una chiusura in Fortran. Basta scrivere un wrapper.
function wrap_f(x) result(res) ... res = f(a,b,...) end function
Può essere una funzione interna o del modulo e ottenere b
dall’associazione host o può utilizzare il modulo contenente a
e b
.
Se si desidera passare la funzione come argomento reale, non può essere una procedura interna fino a Fortran 2003, ma solo in Fortran 2008. Funziona tuttavia nelle versioni recenti di gfortran e ifort. Per una migliore portabilità, utilizzare un modulo.
Posso mostrare una buona soluzione per questo problema. Sono anche un ex utente di MATLAB e quando si passa a FORTRAN manchi la funzione haha. Ho risolto il tuo problema in questo modo:
module private public :: f , g real(kind=RP) :: a0,b0,c0,... contains function f(x,a,b,c,d,...) implicit none real(kind=RP) :: x,a,b,c,d,... real(kind=RP) :: f ! Here you define your function f = ... end function f function g(x) implicit none real(kind=RP) :: x , g ! Here you call "f" function with the frozen variables *0 g = f(x,a0,b0,c0,...) end function g ! We said that parameters were private ! (to avoid to be modified from the outside, which can be dangerous, ! so we define functions to set their values subroutine setValues(a,b,c,...) implicit none real(kind=RP) :: a,b,c,... a0 = a b0 = b c0 = c end subroutine setValues end module