Re: Linking my fortran subroutines with Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg111302] Re: Linking my fortran subroutines with Mathematica
- From: "Eduardo M. A. M.Mendes" <emammendes at gmail.com>
- Date: Tue, 27 Jul 2010 04:15:37 -0400 (EDT)
Hi again >yes, I'm pretty sure you can just use gfortran. It just wasn't >available as osx-port on my mac at work here, so I used g95. Great! >And if your functions have multiple output parameter why don't >you use a subroutine in fortran. When I understood this right, it's >just like have pointers arguments in C and you set the value through >adress. In your MathLink C function it would then be something like >void mathlinkfunc(double input1, double intput2) { >double out1, out2; >fortransub_(&input1, &intput2, &out1, &out2); >MLPutFunction(stdlink, "List", 2); >MLPutReal(stdlink, out1); >MLPutReal(stdlink, out2); >} I only use subroutines. The C-wrapper for another software does the job of allocating (I cannot write the name of the software and if I do the Moderator will go berserk) the variables (pointers in C). Just to be sure, the above chunk of code goes where > double multiply( double a, double b) > { > return fortfunc_(&a, &b); > } is, isn't it? If not, where in you earlier example? >You need to set the :ReturnType: of the template to Manual and it >*should* >work. But hey, you are the fortran-guy. Those were my first 5 lines of >fortran, >so please take this as a hint and not as a working sample. Long time without coding in fortran. I became lazy due to the extensive use of another software. Cheers Ed Am Jul 26, 2010 um 6:44 PM schrieb Eduardo M. A. M.Mendes: > Hi Patrick > > Many many thanks. I shall try it on both linux and Windows. > > Do you think that I can swap g95 for gfortran for both Win and Linux? > > Since my routines have multiple output parameters, I wonder whether > if the > ReturnType could be something like {Real, Real} (that is, instead of > functions I have subroutines with multiple input and output > arguments}. > > Cheers > > Ed > > > -----Original Message----- > From: Patrick Scheibe [mailto:pscheibe at trm.uni-leipzig.de] > Sent: Monday, July 26, 2010 10:37 AM > To: Eduardo M. A. M.Mendes > Cc: mathgroup at smc.vnet.net > Subject: Re: [mg111250] Linking my fortran subroutines with > Mathematica > > Hi, > > I never wrote fortran but it shouldn't be too hard. > First the fortran-file "function.f90" with the content > >>>>>> > real*8 function fortfunc(a,b) > real*8 a,b > fortfunc=a*b > end function fortfunc >>>>>> > > Second the interface.tm for the MathLink > >>>>>> > #include "mathlink.h" > > extern "C" double fortfunc_(double *a, double *b); > > :Begin: > :Function: multiply > :Pattern: multiply[a_?NumericQ, b_?NumericQ] > :Arguments: { a, b } > :ArgumentTypes: { Real, Real } > :ReturnType: Real > :End: > > double multiply( double a, double b) > { > return fortfunc_(&a, &b); > } > > int main(int argc, char* argv[]) > { > return MLMain(argc, argv); > } >>>>>> > > Compile the fortran file with > > g95 -Wall -c function.f90 > > process the .tm file with the mprep program to create the .c file > > mprep -o interface.c interface.tm > > compile the file and link it with the objectfile from your fortran > code > > g++ -I$mpath interface.c function.o -L$mpath -lMLi3 > > Here $mpath contains the path to the MathLink compiler stuff. On my > OSX this is > > mpath=/Applications/Development/Mathematica7.app/SystemFiles/Links/ > MathLink/DeveloperKit/CompilerAdditions/ > > on a linux box the Mathematica root is usually under /usr/local/ > Wolfram/Mathematica/ > > Then you can start the executable > > ./a.out -linkname blub -linkmode listen > > and use it inside a Mathematica session with e.g. > > lnk = Install[LinkConnect["blub"]] > LinkPatterns[lnk] > multiply[10.0, 11.0] > Uninstall[lnk] > > That's it. > > Cheers > Patrick > > > Am Jul 26, 2010 um 1:06 PM schrieb Eduardo M. A. M.Mendes: > >> Hi >> >> Many thanks. >> >> Won't you have an example? >> >> Cheers >> >> Ed >> >> >> -----Original Message----- >> From: Patrick Scheibe [mailto:pscheibe at trm.uni-leipzig.de] >> Sent: Sunday, July 25, 2010 10:35 PM >> To: emamm >> Cc: mathgroup at smc.vnet.net >> Subject: Re: [mg111250] Linking my fortran subroutines with >> Mathematica >> >> Hi, >> >> just make a wrapper for your Fortran functions so you can call them >> from >> C. Once this is done you can simply call them through the MathLink. >> You could start by compiling your Fortran functions into a .so >> or .dll >> or however the shared libraries are called on your OS. Then create a >> MathLink-template and call those functions from there.. >> >> I really don't know how to explain this better since it is straight >> forward and you should have a running example in a few minutes. >> >> Cheers >> Patrick >> >> On Sun, 2010-07-25 at 01:58 -0400, emamm wrote: >>> Hello >>> >>> I am new to Mathematica. Although I have searched the web for >>> answers >>> on how to link fortran to Mathematica without buying MathCode F90, I >>> have not found good examples on how to link Fortran to Mathematica. >>> >>> All my fortran functions were modified to accept a C-wrapper. I did >>> that to link them to another system. I have no problem to create >>> mex files >> on >>> either Windows or Linux using gcc,gfortran or g95 (all free >>> compilers!). My fortran functions work exactly as m-file on the >>> other >> system >>> with lots of input and output arguments - The input arguments >>> determine the size of the output arguments via malloc on C. >>> >>> I believe that there is something similar to a mex file for >>> Mathematica but the documentation on Wolfram's site does not give me >>> much information. >>> >>> Would someone out there have a nice, neat example (not too simple, >>> please - addrow from Wolfram's site is way too simple!) on how to >>> link >>> fortran to Mathematica? >>> >>> Many thanks >>> >>> Ed >>> >>> >>> PS. MathCode F90 seems to do what I want but for a a price (and >>> what a >>> price!). >>> >> >> > >