Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Linking my fortran subroutines with Mathematica

  • To: mathgroup at smc.vnet.net
  • Subject: [mg111299] Re: Linking my fortran subroutines with Mathematica
  • From: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
  • Date: Tue, 27 Jul 2010 04:15:04 -0400 (EDT)

Hi,

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.

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);
}

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.

Cheers
Patrick



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!).
>>>
>>
>>
>
>



  • Prev by Date: Re: Scoping constructs Block, Module, ModuleBlock violate
  • Next by Date: Re: tweaking VectorPlot...
  • Previous by thread: Re: Linking my fortran subroutines with Mathematica
  • Next by thread: Re: Linking my fortran subroutines with Mathematica