MathGroup Archive 2011

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

Search the Archive

call Fortran subroutine from Mathematica // use NETLink and DLL

This post explains how to call a Fortran subroutine as a DLL from Mathematica. I don't think the hints in this post exist in explicit form in the Wolfram documentation or in the MathArchive, at least so far as I could find.  

There is information in a post from Wolfram for how to use Mathlink via C wrappers to get to Fortran subroutines (version 3 of Mathematica? *BUT* I think since the introduction of NETLink into Mathematica (version 6?), the matter is now much more straightforward, at least in a Windows environment. 

The purpose of this post is therefore to a future user who might want to follow what I have done.

>From Windows7, 64-bit, and using the gnu compiler (, here is the trace of the CMD commands:

      22-Jul-11 21:16 336 SumAndDifference.f90

C:\Demo>more SumAndDifference.f90

subroutine sum_and_difference(i,j,resultArray)
      implicit none
      integer*4, intent (in) :: i 
      integer*4, intent (in) :: j 
      integer*4, dimension(2), intent (out) :: resultArray 
      resultArray(1) = i + j 
      resultArray(2) = i - j 
end subroutine sum_and_difference

C:\Demo>gfortran -c SumAndDifference.f90

C:\Demo>gfortran -s -shared -mrtd -o SumAndDifference.dll SumAndDifference.

      22-Jul-11 21:21 12,800 SumAndDifference.dll
      22-Jul-11 21:16 336 SumAndDifference.f90
      22-Jul-11 21:20 429 SumAndDifference.o

Now follows the Mathematica part:

In[1]:= Needs["NETLink`"]

In[2]:= SetDirectory@NotebookDirectory[]
Out[2]= "C:\\MyFortran"

In[3]:= $pathToDLL = FileNameJoin[{Directory[], "SumAndDifference.dll"}]
Out[3]= "C:\\MyFortran\\SumAndDifference.dll"

[To understand below, read: ]
[Note addition of "_" to "sum_and_difference" that is done by compiler.]
In[4]:= SumAndDifference =  DefineDLLFunction["sum_and_difference_", $pathToDLL,  "void", {"Int32*", "Int32*", "Int32[]"}]

In[5]:= results = MakeNETObject[{0, 0}, "System.Int32[]"]

In[6]:= SumAndDifference[10, 20, results]

In[7]:= NETObjectToExpression@results
Out[7]= {30, -10}

  • Prev by Date: Re: How Can I Include a Button in a Manipulate
  • Next by Date: Re: FinancialData still broken
  • Previous by thread: Re: Code is not working...
  • Next by thread: CDF Files Break when being mailed or uploaded