Passaggio della funzione esterna di più variabili in funzione di una variabile in Fortran

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