Fortran or C user routines call
// long form 'out' is present
[y1,...,yk] = call("ident",x1,px1,"tx1",...,xn,pxn,"txn","out",[ny1,my1],py1,"ty1",...,[nyl,myl],pyl,"tyl")
// short form : no 'out' parameter
[y1,....,yk] = call("ident",x1,...,xn)
:”ident” string. : :xi real matrix or string : :pxi, pyi integers : :txi, tyi character string “d”, “r”, “i” or “c”. :
Interactive call of Fortran (or C) user program from Scilab. The routine must be previously linked with Scilab. This link may be done:
There are two forms of calling syntax, a short one and a long one. The short one will give faster code and an easier calling syntax but one has to write a small (C or Fortran) interface in order to make the short form possible. The long one make it possible to call a Fortran routine (or a C one) whitout modification of the code but the syntax is more complex and the interpreted code slower.
The meaning of each parameter is described now:
:”ident” is the name of the called subroutine. : :x1,...,xn are input variables (real matrices or strings) sent to
the routine,
:
If an output variable coincides with an input variable (i.e. pyi=pxj ) one can pass only its position pyi . The size and type of yi are then the same as those of xi. If an output variable coincides with an input variable and one specify the dimensions of the output variable [myl,nyl] must follow the compatibility condition mxk*nxk >= myl*nyl.
//Example 1 with a simple C code
f1=['#include <math.h>'
'void fooc(double c[],double a[],double *b,int *m,int *n)'
'{'
' int i;'
' for ( i =0 ; i < (*m)*(*n) ; i++) '
' c[i] = sin(a[i]) + *b; '
'}'];
`mputl`_(f1,'fooc.c')
//creating the shared library (a gateway, a Makefile and a loader are
//generated.
`ilib_for_link`_('fooc','fooc.c',[],"c")
// load the shared library
`exec`_ loader.sce
//using the new primitive
a=[1,2,3;4,5,6];b= %pi;
[m,n]=`size`_(a);
// Inputs:
// a is in position 2 and double
// b 3 double
// n 4 integer
// m 5 integer
// Outputs:
// c is in position 1 and double with size [m,n]
c=call("fooc",a,2,"d",b,3,"d",m,4,"i",n,5,"i","out",[m,n],1,"d");
//Example 2 with a simple Fortran code
f1=[' subroutine foof(c,a,b,n,m)'
' integer n,m'
' double precision a(*),b,c(*)'
' do 10 i=1,m*n '
' c(i) = sin(a(i))+b'
' 10 continue'
' end'];
`mputl`_(f1,'foof.f')
//creating the shared library (a gateway, a Makefile and a loader are
//generated.
`ilib_for_link`_('foof','foof.f',[],"f")
// load the shared library
`exec`_ loader.sce
//using the new primitive
a=[1,2,3;4,5,6];b= %pi;
[m,n]=`size`_(a);
c=call("foof",a,2,"d",b,3,"d",m,4,"i",n,5,"i","out",[m,n],1,"d");