Scilab provides a compiler (under development) to transform some Scilab functions into Fortran subroutines. The routines which are thus obtained make use of the routines which are in the Fortran libraries. All the basic matrix operations are available.
Let us consider the following Scilab function:
function [x]=macr(a,b,n) z=n+m+n, c(1,1)=z, c(2,1)=z+1, c(1,2)=2, c(2,2)=0, if n=1 then, x=a+b+a, else, x=a+b-a'+b, end, y=a(3,z+1)-x(z,5), x=2*x*x*2.21, sel=1:5, t=a*b, for k=1:n, z1=z*a(k+1,k)+3, end, t(sel,5)=a(2:4,7), x=[a b;-b' a']
which can be translated into Fortran by using the function mac2for. Each input parameter of the subroutine is described by a list which contains its type and its dimensions. Here, we have three input variables a,b,c which are, say, double precision, double precision, integer with dimensions (m,m), (m,m), (1,1). This information is gathered in the following list:
l=list(); l(1)=list('1','m','m'); l(2)=list('1','m','m'); l(3)=list('0','1','1');The call to mac2for is made as follows:
comp(macr); mac2for(macr2lst(macr),l)The output of this command is a string containing a stand-alone Fortran subroutine.
subroutine macr(a,b,n,x,m,work,iwork) c! c automatic translation . . . double precision a(m,m),b(m,m),x(m+m,m+m),y,z1,24(m,m),work(*) integer n,m,z,c(2,2),sel(5),k,iwork(*) . . . call dmcopy(b,m,x(1,m+1),m+m,m,m) call dmcopy(work(iw1),m,x(m+1,1),m+m,m,m) call dmcopy(work(iw1),m,x(m+1,m+1),m+m,m,m) return c endThis routine can be linked to Scilab and interactively called.