Locked History Actions

ROOT/MathMore

ROOT/MathMore

  • MathMore を使ったときのメモ。ROOT で特殊関数などを使いたい場合、MathMore ライブラリをロードする必要がある。

インストール

  • 以下では、すでに ROOT が インストールされているところに MathMore ライブラリを追加でインストールしたつもり。MathMore ライブラリだけをインストールすることはできるんだろうか?

  • GSL インストール

    • MathMore を使うには GSL - GNU Scientific Library が必要。ROOT のバージョンが v5.32.04 の場合、 GSL のバージョンは 1.8 以上が必要。Scientific Linux 6.4 (64 bit) では、以下のように yum で簡単にインストールできる。インストールされるバージョンは 1.13 なので 1.8 より 5 バージョン新しい。ROOT が要求する GSL のバージョンは ./configure --help で確認できる。

    • $ su
      パスワード : ルートのパスワードを打つ
      # yum install gsl gsl-devel
      ...
    • gsl パッケージだけインストールしても、ROOT の configure スクリプトが GSL を見つけてくれないので、gsl-devel パッケージも同時にインストール。具体的には、gsl-config というコマンドがないとダメなのかも?
    •  

  • ./configure の実行

    • まず、ROOT のソースを展開したときにできたディレクトリ (configure スクリプトがある) に移動。ここで configure スクリプトを実行し直すが、以前指定したオプションに --enable-mathmore オプションを追加する。これで、make 実行時に mathmore ライブラリがコンパイルされる。コンパイル時(?)のオプションは configure スクリプトと同じディレクトリ内の config.status に書かれている。config.log にも configure スクリプトのログが残るが、 ./configure --help としただけで config.log は上書きされる。
    • $ cd <ROOT のソースを展開したときにできたディレクトリ>
      $ ./configure <以前のオプション> --enable-mathmore # 以前のオプションの指定は、 `cat config.status` としても良いはず
    •  

  • ROOT の make と インストール

    • $ ./configure の実行後、make して make install を実行する。いくつかのソースはコンパイルし直すようだが、ほとんどのソースは再コンパイルしないようだ?これで、MathMore ライブラリがインストールされる。

    • $ make
      $ make install
      • make をし直す場合、並列コンパイルの -jN オプションを指定すると最後で止まるときがあるかも? v5.32.04 だと止まるようだ。

使い方

  • マクロ内で使う

    • 例えば、マクロ内で球ベッセル関数 jl(x) と球ベッセル関数 nl(x)を使う場合、以下のように書く。マクロのファイル名は test.C とする。

      • #include "Math/SpecFunc.h"
        #include <iostream>
        
        void test() {
          std::cout << "j_1(2): " << ROOT::Math::sph_bessel(1, 2.)  << std::endl;
          std::cout << "n_1(2): " << ROOT::Math::sph_neumann(1, 2.) << std::endl;
        }
    • ROOT を起動したら、マクロを実行する前に、まずライブラリをロードする(参考: Rin-memo - ROOT/特殊関数いろいろ)。そのあと .x コマンドでマクロを実行。具体的なコマンドは下記のようになる。

      • $ root -l
        root [0] gSystem->Load("libMathMore")
        (int)0
        root [1] .x test.C
        j_1(2): 0.435398
        n_1(2): -0.350612
    • .x test.C+ というように "+" 付きで .x コマンドを実行すれば、 ACLiC でコンパイルしてから実行される。ただし、コンパイルの前に gSystem->Load("libMathMore") を実行する必要がある。

    •  

  • その他の関数

Examples

  • クレブシュ-ゴルダン係数

    • ROOT::Math::wigner_3j 関数を用いたクレブシュ-ゴルダン係数の計算はこちら

    •  

  • 球ベッセル関数と球ノイマン関数

  • 平面波の展開

    • 球 Bessel 関数や Legendre 多項式を使ってみる。平面波をこれらの関数で展開し、ある l まで足し合わせると、下図の gif アニメのようになる。ただし平面波は x 軸方向に進み、cosθ = x/r, z = 振幅 としている。

    • mov.gif

    • このファイルは以下のように作った。
    • libMathMore をロードし、plot.C を ACLiC でコンパイルして実行。

    • $ root
      root [] gSystem->Load("libMathMore")
      (int)0
      root [] .x plot.C+
      Info in <TUnixSystem::ACLiC>: creating shared library /home/koba/Dropbox/works/root/mathmore/./plot_C.so
      Info in <TCanvas::Print>: GIF file fig00.gif has been created
      Info in <TCanvas::Print>: GIF file fig01.gif has been created
      Info in <TCanvas::Print>: GIF file fig02.gif has been created
      ...
      root [] .q
      $
    • さらに、以下のように convert コマンドで mov.gif という名の gif アニメーション画像を作る。loop オプションで 0 を指定するとループ回数の制限がなくなり、ずっとループする。delay オプションには、画像の切り換え時間 (10ms 単位?)を指定する。50 を指定すると、 500 ms で切り換わるようだ?
    • $ convert -loop 0 -delay 50 fig*.gif mov.gif
    • 参考: ImageMagick

エラー

  • CINT のプロンプト上(?)で MathMore のライブラリを使うとき、ライブラリをロードするが(参考: Rin-memo - ROOT/特殊関数いろいろ)、MathMore library がインストールされていないと以下のエラーとなる。

  • root [] gSystem->Load("libMathMore");
    Error in <TUnixSystem::DynamicPathName>: libMathMore[.so | .dll | .dylib | .sl | .dl | .a] does not exist in /home/koba/cern/root_v5.32.04/lib/root:/root:/root:/root:/home/koba/cern/anaroot/lib:/home/koba/cern/anaroot/lib:.:/home/koba/cern/root_v5.32.04/lib/root::/home/koba/cern/root_v5.32.04/lib/root/cint/cint/stl