MathematicaセッションでFortranコードを呼び出すことに興味があります。Mathlinkがそれを行う方法を提供していることを学びました。しかし、私はCについてほとんど知識がなく、C++については何も知りません。誰かが私に詳細な例を教えてくれますか?
私はMathematica8、MS Visual Studio 2008、IntelFortran11で使用しています。システムはWindows7HomePremiumです。
どうもありがとう!
MathematicaセッションでFortranコードを呼び出すことに興味があります。Mathlinkがそれを行う方法を提供していることを学びました。しかし、私はCについてほとんど知識がなく、C++については何も知りません。誰かが私に詳細な例を教えてくれますか?
私はMathematica8、MS Visual Studio 2008、IntelFortran11で使用しています。システムはWindows7HomePremiumです。
どうもありがとう!
以下は、Windows システムで gfortan と gcc を使用して成功した明示的な例です。
このブログAdventures in Mathlinkを見つけました。具体例付きで助かります。gfortran と gcc を使うために MinGW をインストールしました。インストール後、毎回パスを入力せずに gfortran と gcc を使用するには、PATH を設定する必要があります。システムを再起動せずに PATH を追加するためのヒント: PATH を追加した後、cmd を開いて実行しますset PATH=C:
。次に、cmd を閉じます。もう一度開くとecho %PATH%
、新しいパス リストが表示されます。リンクされたブログの手順に従い、Windows に合わせて、チュートリアルの例 addtwo を使用しました。
実行可能ファイルを生成するために .bat ファイルを書き込んで実行する Mathematica コード
(* Write a .bat file to compile the MathLink template *.tm, FORTRAN codes *.f and
C codes *.c files, and run it to create an executable file. *)
CreateExeF[s_String] :=
Module[{dir, libdir, bindir, BatCode, bat}, dir = NotebookDirectory[];
{libdir, bindir} = StringJoin[
"\"", $InstallationDirectory,
"\\SystemFiles\\Links\\MathLink\\DeveloperKit\\Windows\\CompilerAdditions\\mldev32\\",
#] & /@ {"lib\\", "bin\\"};
BatCode = StringJoin[
"gfortran -c ", #, ".f -o ", #, "f.o
gcc -c ", #, ".c -o ", #, ".o
",
bindir, "mprep.exe\" ", #, ".tm -o ", #, "tm.c
gcc -c ", #, "tm.c -o ", #, "tm.o
gcc ", #, "tm.o ", #, ".o ", #, "f.o ",
libdir, "ml32i3m.lib\" ",
"-lm -lpthread -mwindows -lstdc++ -o ", #
] &;
(* write the .bat file *)
bat = Export[FileNameJoin[{dir, # <> ".bat"}], BatCode[dir <> #],
"string"] &[s];
(* run the .bat file *)
Run[bat]]
FORTRAN コードaddtwo.f
subroutine addtwof(i,j,k)
integer i, j, k
k = i + j
end
C ラッパーaddtwo.c
#include "mathlink.h"
int addtwo(int i, int j)
{
int res;
addtwof_(&i, &j, &res);
return res;
}
#if WINDOWS_MATHLINK
#if __BORLANDC__
#pragma argsused
#endif
int PASCAL WinMain( HINSTANCE hinstCurrent, HINSTANCE hinstPrevious, LPSTR lpszCmdLine, int nCmdShow)
{
char buff[512];
char FAR * buff_start = buff;
char FAR * argv[32];
char FAR * FAR * argv_end = argv + 32;
hinstPrevious = hinstPrevious; /* suppress warning */
if( !MLInitializeIcon( hinstCurrent, nCmdShow)) return 1;
MLScanString( argv, &argv_end, &lpszCmdLine, &buff_start);
return MLMain( (int)(argv_end - argv), argv);
}
#else
int main(int argc, char* argv[])
{
return MLMain(argc, argv);
}
#endif
テンプレート ファイルaddtwo.tmは、Todd Gayley のチュートリアルのものと同じです。完全を期すために、ここにも記載されています。
:Begin:
:Function: addtwo
:Pattern: AddTwo[i_Integer, j_Integer]
:Arguments: { i, j }
:ArgumentTypes: { Integer, Integer }
:ReturnType: Integer
:End:
:Evaluate: AddTwo::usage = "AddTwo[i, j] gives the sum of two integer numbers i and j."