Dear All

I wonder if it is possible to use functions rather than arrays as an input when call compiled dlls in GAUSS?

## 5 Answers

0

accepted

Many optimization codes have a reverse communication interface where the compiled code (FORTRAN/C/C++) will return a specific return value when it would like the objective function to be evaluated along with the values at which it would like them evaluated at.

Below is a simple example of the concept. For this example, we will assume that we have a FORTRAN function that will assign `ret` to be equal to 1, assign the values at which it would like the function evaluated to `parmout` and then return whenever it would like a function evaluation. You could then set up your GAUSS code something like this:

ret = 1; parmin = zeros(4, 1); parmout = zeros(4, 1); ans = zeros(4,1); do while (ret); dllcall fortranOptRoutine(parmin, parmout, ans, ret); if (ret == 1); parmin = myFunc(parmout); endif; endo; proc (1) = myFunc(x); retp(x*x); endp;

0

Functions that are called with `dllcall` can only accept GAUSS variables as inputs.

Are you wanting to save the step of assigning the output of a GAUSS procedure to a variable before passing it to the function you are calling with `dllcall`? Or are you wanting to try to pass a GAUSS function in to a compiled (C/C++/Fortran) function that takes a function pointer as an argument?

If you provide a little more information, I may be able to help you accomplish your end goal.

0

Thanks.

I want to know how to pass a GAUSS function into a compiled Fortran function that takes a function pointer as an argument.

0

You cannot directly pass a GAUSS procedure into a Fortran function that takes a function pointer as an argument. There may be a work around. Could you provide some information about the Fortan code? Do you have the source code?

0

I do have the FORTRAN source code which does optimization, in this optimization subroutine, there is a call to another FORTRAN subroutine, say FCN(N, X, F):

subroutine FCN(N,X,F) double precision X, F F = x*x return end

which defines the objective function.

I want to compile the optimization subroutine and call it within GAUSS, while the definition of the objective function FCN is written in GAUSS rather than Fortran.

## Your Answer

## 5 Answers

Many optimization codes have a reverse communication interface where the compiled code (FORTRAN/C/C++) will return a specific return value when it would like the objective function to be evaluated along with the values at which it would like them evaluated at.

Below is a simple example of the concept. For this example, we will assume that we have a FORTRAN function that will assign `ret` to be equal to 1, assign the values at which it would like the function evaluated to `parmout` and then return whenever it would like a function evaluation. You could then set up your GAUSS code something like this:

ret = 1; parmin = zeros(4, 1); parmout = zeros(4, 1); ans = zeros(4,1); do while (ret); dllcall fortranOptRoutine(parmin, parmout, ans, ret); if (ret == 1); parmin = myFunc(parmout); endif; endo; proc (1) = myFunc(x); retp(x*x); endp;

Functions that are called with `dllcall` can only accept GAUSS variables as inputs.

Are you wanting to save the step of assigning the output of a GAUSS procedure to a variable before passing it to the function you are calling with `dllcall`? Or are you wanting to try to pass a GAUSS function in to a compiled (C/C++/Fortran) function that takes a function pointer as an argument?

If you provide a little more information, I may be able to help you accomplish your end goal.

Thanks.

I want to know how to pass a GAUSS function into a compiled Fortran function that takes a function pointer as an argument.

You cannot directly pass a GAUSS procedure into a Fortran function that takes a function pointer as an argument. There may be a work around. Could you provide some information about the Fortan code? Do you have the source code?

I do have the FORTRAN source code which does optimization, in this optimization subroutine, there is a call to another FORTRAN subroutine, say FCN(N, X, F):

subroutine FCN(N,X,F) double precision X, F F = x*x return end

which defines the objective function.

I want to compile the optimization subroutine and call it within GAUSS, while the definition of the objective function FCN is written in GAUSS rather than Fortran.