研究室トップ / 真貝のトップ / サイトマップ

Cactusコード?

Last update: 2003/8/1 2006/11/8

What's New
2006/11/8Intel Mac [MacOS X 10.4.8 (darwin8.8)] での解決策? 追加
2003/11/20Mac OS X 10.2.8 (darwin6.8) での解決策? 追加
2003/8/1Mac OS X 10.2 (darwin6.6) では,public版は動かないことが判明.解決策を 追加
2003/7/18MacOSでのPETScの最新対応状況について 追加
2003/1/8 サイエンティフィックシステム研究会(SS研)主催の Grid Computing第2回会合 にてCactusコード紹介の講演を頼まれました.講演に利用するスライドは, ここ[slide pdf 3.4M]です.
2002/12/4 金沢大田子研究室の 大橋氏が,Cactusコードの研究を小橋氏の後を引き継いで続けておられます. Cactusコードのソフトウエアとしての位置づけ等に関しては, 彼のホームページを先に読まれることをお薦めします.

Contents
  1. Cactusコードとは?
  2. 動作確認
  3. ダウンロード
  4. お試しテスト:コンパイルと実行
  5. Cactusコードにおける楕円型solverについて
  6. 必要なメモリ
  7. 現在の課題



  1. Cactusコードとは?

    Cactusコードは,巨大数値シミュレーションを行う際に,並列計算環境を提供するツールである. コードは http://www.cactuscode.org/より,無料でダウンロードできる. 開発しているのは,ドイツ・アインシュタイン研究所の数値相対論グループである. 開発開始(1997)から5年余りを経て,大枠はほぼ固定し,最近はメジャーアップグレードすることは 少なくなった(ユーザから見れば,アップグレードに伴う規格変更に悩まされることが少なくなった).

    Cactusとは「サボテン」の意味であり,一つの基盤(基盤のことをCactusコードでflesh 「果肉」と呼ぶ)から多くのモジュール(モジュールをCactusではthorn「とげ」 と呼ぶ)が使えるように,との設計者の意図 が込められている.開発目的は一般相対性理論の数値計算であったが,Cactusコードの基盤のみ を用いて流体計算などを行うことも可能であり,実際,開発グループは,他の分野への応用に意欲的である. また,日本でも最近,グリッドコンピューティングの点からも,注目を集めているようである.

    一般相対性理論の数値シミュレーションは,メモリ・計算速度・ディスク容量などの点で, 計算機資源に常に枯渇している状況である.物理的な結果を取り出すには,精密な計算が必要であり, そのためには,並列計算プログラムを作成して,分散計算を行うことが欠かせない. 開発者のねらいの一つは,複雑な並列計算プログラムをプログラマーに意識させることなく,パッケージ として自動化させることであった.
    また,プログラムを共同開発していると,開発者の使うマシンやOSの違い,あるいはプログラム言語や コンパイラの違いも問題になってくる.Cactusは,これらのテクニカルな部分を,プログラマー側から 開放する.

    アインシュタイン研究所の数値相対論グループは,一般相対論の計算コードもダウンロード可能と しているが,世界のいくつかの研究グループは,Cactusの基盤部分だけを借用し,独自のコードを Cactus上に構築している.今後も,このような利用法が,増えることと予想されるので,ここでは 私の経験を踏まえた覚え書きを書き留めておきたい.

    Cactusコードのメリットは,

    • 「一つのコードで,多くの機種に対応できる」
      多くのOSやコンパイラ対応がサポートされていて, LinuxでもMacOSXでも同じ一つのコードで仕事ができる. ラップトップでプログラムし,デバッグが完成すれば,即日 スーパコンピュータやPCクラスタで,大規模計算が可能になる. 各OSやコンパイラに対応したMakefileが準備されており, 並列処理コマンドを含めて,コンパイルは,自動的に最適に処理される.
    • 「FortranでもCでも自分の得意な言語でモジュールを作成し,他の人と共同開発 できる」
      もともと共同開発を目的にしているので,モジュール間の文法は厳格に定められている. 各自,thornと呼ばれるモジュールを作成することになるが,各モジュール内で(あるいは全体で 共通に)パラメータ,3次元マトリックス(gridfunctionと呼ぶ),コードの呼び出し スケジュールを指定することが可能である.
    • 「パラメータファイルが優れている」
      グリッドの大きさもパラメータファイルから指定でき,再コンパイルは必要ない.
    • 「I/Oが良い」
      gridfunctionの1次元,2次元,3次元プロットの書き出しが,MPIを気にせずに パラメータファイルで指定できる.
    という所だろうか. 金沢大学の 小橋氏 によれば,
    • 「CactusはGlobus MetacomputingツールキットやHDF5並列ファイルI/O、 PETSc科学ライブラリ、Webインターフェイス、最先端可視化ツールと言ったようなアカデミック研究コミュニティーで開発されたCutting edgeソフ トウェア技術を用意に取り込むことができます。」
    などと,私には解らない視点からもメリットが記載されている.

    動く環境はSGI, Linux, Crayをはじめ多くの機種,OSをサポートしている.
    http://www.cactuscode.org/Documentation/Architectures.html
    昨年秋,私のリクエストで開発者がFujitsu VPPへのサポートを開始した.まだ 完全ではないが,現在進展中である.

    Cactusを動かすのに必要なソフトウェアは,Perl/GNUmake/C/CPP/. Fortranを使うなら,F90またはF77のコンパイラも必要. C++を使うなら,C++コンパイラも必要. ダウンロードするには,CVSがあると便利.
    http://www.cactuscode.org/Guides/Stable/UsersGuide/UsersGuideHTML/node4.html
    私は,Macユーザで,プログラミングにはOS Xを使っている.MacでCactusを使うことに 関するtipsは,このページで,所々に触れている. また,最近私は,自らPCクラスタを組んで,Cactusを並列に走らせる,という暴挙をやってのけた. そこでの苦労話はここにまとめてある.

    私自身,自ら望んだわけではなかったが,在米中,何らかの形でCactusコードに関わることになり, それが現在に続いている. Washington大学所属時のグループは,Cactus開発者グループと密接な関係にあったので,私 は,開発初期段階からご意見番として関わった (ああしろ,こうしろ,と文句を言っていた,というのが正しい).当時はCactusコードの 開発思想が錯綜し, 何度も根底部分で変更があり,多くの時間をコードのメインテナンスに費 やされてしまった.
    続いてPennState大学に移ったときは,研究面ではむしろ 競合するグループだったが,やはりCactusの基盤を使って,独自に コードを作成していた.彼らはすべてのコードを一つのthornに収める,という 方針であった.
    現在,私は,両グループのコード開発思想の中庸を取った,独自の数値コード(GRコード)を開発している. GRコードに関しては,ここにまとめてある(作成中).

    Cactusコードのデメリットは,

    • マニュアルがすべて英語であること,
    • コード作成修得までに数週間から一ヶ月程度の時間を要すること,
    • 開発者がいきなり 仕様を変えることにより時としてメインテナンスに時間が割かれること
    であろう. この最後の点に於いて,私はCactusコードを使うプロジェクトを日本で起こすことに 若干ためらいがあった.しかし,何人かの方からの質問を受けたり,並列計算や 大型シミュレーションを行う上では,やはり一つの作戦であろう,と考え,本腰を 入れることにした. これまで得られたノウハウは,すべてここに 公開しているつもりである.

    私自身は,マシンのハードには全く弱い. プログラムはFortran 90/77でしか書けない. これまで,Cactusコードは,ユーザとして使ってきただけである. 興味ある方からのリアクションがあれば,とても助かるし,それこそ このページの目標とするところ.Feedbackがあれば,よろしくお願いします.

    日本語でCactusを紹介した記事を発見.

    英語ですが


  2. 動作確認

    2-1.version 4 beta 11 (2002/1 released) 動作確認

    version 4 beta 11 (2002/1 released) について,次の機種で, CactusWavetoyC, CactusWavetoyF90の動作確認を行った. (このコードのダウンロードと 実際の使い方は,以下の章に書いてある).ここのメモは,ほとんど私自身のため.

    • SGI Origin3000
      京都大学基礎物理学研究所の SGI Originは, gnumakeを使うことにのみ注意すれば,後は問題なく動作する.
    • Fujitsu VPP
      理化学研究所のVPP 700は,現在,特定のマシンでのみコンパイルでき,実行できる.
    • Linux OS with Fujitsu Fortran (maha/mana)
      Fujitsu Fortranでは, マシン固有のコンパイルオプションを付けることで動作します.Fujitsu Fortranは,モジュール のあるF90のコンパイルに-Awオプションが必要なため,
      setenv LIBS "crypt"
      setenv LIBDIRS "/usr/lib /usr/FFC/lib"
      gmake xxx F90FLAGS=-Aw LIBS=crypt
      
      とする.あるいは,gmake xxx F90FLAGS=-Aw で,コンパイルした後, configs/xxx/config-data/make.config.defn の中を
      LIBS    += crypt
      LIBDIRS += /usr/lib /usr/FFC/lib
      
      と書き換える.
    • Linux OS with Intel Fortran
      gmake xxx F90=ifc で,コンパイルする.
    • MacOS X
      一部コード修正をした上で,動く. http://www.cactuscode.org/Documentation/Architectures/Mac.html
      Fortranは,Absoft社のProFortran v 7.0をインストールすれば,OK.
      最近,若干の工夫が必要になっていることが判明.
      make xxx F90FLAGS=-N11
      
      としないと,だめな場合がある(最近リリースしているversionでは,このオプションが, make.code.defnに記述されている).

    2-2.version 4 beta 12 (2002/6 released) 動作確認

    現在手に入る最も新しいversion 4 beta 12 (2002/6 released) について,次の機種で, MexicoNRsetの動作確認を行った. (このコードのダウンロードと 実際の使い方は,以下の章に書いてある)

    • SGI Origin3000
      京都大学基礎物理学研究所の SGI Originは, gnumakeを使うことにのみ注意すれば,後は問題なく動作する.
    • Fujitsu VPP
      未確認.
    • Linux OS with Fujitsu Fortran (maha/mana)
      Fujitsu Fortranでは, マシン固有のコンパイルオプションを付けることで動作します.Fujitsu Fortranは,モジュール のあるF90のコンパイルに-Awオプションが必要なため,
      setenv LIBS "crypt"
      setenv LIBDIRS "/usr/lib /usr/FFC/lib"
      gmake xxx F90FLAGS=-Aw LIBS=crypt
      
      とする.
    • Linux OS with Intel Fortran
      gmake xxx F90=ifc で,コンパイルする.

    • MacOS X
      一部コード修正をした上で,コンパイル実行できる. http://www.cactuscode.org/Documentation/Architectures/Mac.html
      Fortranは,Absoft社のProFortran v 7.0 または v 8.0 をインストールすれば,OK.
      • コンパイルを開始して、configurationができても、コンパイル途中に
        ar: illegal option -- s
        
        となってエラーが出ることがあるが、これは、lib/make/known-architectures中に 対応するOSのファイルがないことが原因。uname -aコマンドで、darwinのversionを 調べ、既存のarchitectureを作ることで解決できる。
        例えば,darwin5.5のOSの場合,事前に
        cd lib/make/known-architectures
        cp darwin5.4 darwin5.5
        
        とすることが必要.もう一度configurationから始めれば、問題ないはず。
      • (2003/8/1 追記) OS X 10.2 以上(例えばdarwin6.6)で,それでもエラーがでることが判明した. 開発者に相談したところ,darwinファイル(例えば Cactus/lib/make/known-architectures/darwin6.6)に 次のように追記することが必要.
          # no way to generate C++ or Fortran dependencies on this machine
          : ${CXX_DEPEND='echo'}
          : ${F_DEPEND='echo'}
          : ${F77_DEPEND='echo'}
          : ${CXX_DEPEND_OUT='> /dev/null; touch $@'}
          : ${F_DEPEND_OUT='> /dev/null; touch $@'}
          : ${F77_DEPEND_OUT='> /dev/null; touch $@'}
        
        cactusdevcvs版でも,この修正必要.

    2-3.version 4 beta 13 (2003/10 released) 動作確認

    • Mac OS X 10.2.8 (darwin 6.8)
      (2003/11/20追記)OS X 2.8では, Cactus/lib/make/known-architectures/darwin6.6をdarwin6.8にコピーしただけでは駄目で, 新たにversion 4 beta 13 をダウンロードする必要に迫られた.version 4 beta 13 は,darwin 6.8をサポートしている.
      gcc 3.3が必要,とconfigure時に警告文が出る. Appleのサイトでサポートしているgcc 3.3 は,OS X 10.3 (darwin 7.0) 以降の対応版のようなので, gccのサイトよりダウンロードする.gcc 3.3.2 は10.2.8でも動作確認済みとのこと. ダウンロード先は,ftp://ftp.iij.ad.jp/pub/gcc/ より. インストールは,解凍したら,
      ./configure
      make bootstrap (結構時間かかる)
      make -k check
      make install
      

    2-4.version 4 beta 16 (2006/11 developer版) 動作確認

    • Mac OS X 10.4.8 (darwin 8.8.1)
      (2006/11/8追記) MacintoshのCPUがIntel製になり,状況が変わったので,再びインストールにトライした.ここでの動作確認は, IntelMacのみ.

      残念なことに,次章で述べられるpublic版Cactus,developer版Cactusともに,まだIntelMacに対応していない. つまり, Cactus/lib/make/known-architectures のディレクトリにある darwin ファイルは,IntelMacに対応していない. Cactusのページには,configureについて若干記載してあるが,これは一例であり,darwinファイルの書き替えは素人の域を超える. メールで相談すると,Erik君が,彼のdarwinファイルを送ってくれた.必要な方はダウンロードして, 既存のものと入れ替えると良いだろう.当然,自分のOSに対応する darwin8.8.1 ファイルも他に似せて作成しておく 必要がある.

      私のMacBookProは,ついうっかり,Intel Fortran for MacOSを入れてしまったので,また一筋縄では行かず,苦労した. configure時に, 「F77=ifort F90=ifort」とoptionを追加したのでは,何故か上手くいかず,g++がintelのソースファイルを探しに行き, リンクエラーとなって,コンパイルが完了しない.Erik君によると,コンパイラは会社を統一しておくとよいので, Intel C++ for MacOSもインストールして,さらに「CC=icc CXX=icpc」としたら,コンパイルも実行も成功した.Intelコンパイラは,自動で vectorizationもしてくれるので素晴らしいが,出費はちょっとある.(30日間は無料トライアルが可能である).


  3. Cactusをダウンロードする方法

    • CVS(Concurrent Versioning System: http://www.cvshome.org/)がインストールされているマシンを使う.
    • cactusのサイトにCVSがアクセス可能になるようにloginする.
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactus login
      
      パスワードはanonである. ダウンロード可能なファイル名は
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactus checkout -s
      
      とすると,表示される.
    • CVSでcactusのflesh部分をまずダウンロード
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactus checkout Cactus
      
    • 次にダウンロードされたCactusディレクトリの中に入って,
      gmake checkout
      
      arrangementをとりあえずすべてダウンロードする.
    以上でpublicスペースに置かれているファイルをダウンロードできたことになる. これは,以下に述べるWavetoyも,一般相対論(public版)コードもすべて含む. ファイルのサイズは,31MByte.compressして8.4MByteになる.

    以上がpublic版のダウンロードである.最新版は2002年6月にリリースされた 4.0 beta 12である.実は,開発中のバージョンも同じ手段で ダウンロード可能である.バグがあったり,日毎に仕様が変わってしまったりすることも あるが,最新のコードを必要とするときは,次にようにすると良い.

    • cactusのdevサイトにCVSがアクセス可能になるようにloginする.
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs login
      
      パスワードはanonである.そして例えば
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout -s
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout Cactus
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout CactusBase
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout CactusEinstein
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout CactusEinstein/ADM
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout CactusElliptic
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/cactusdevcvs checkout CactusPUGH
      
    • (2002/10/11 update)ポツダムのグループが,一般には公開していないコードも,協力関係があれば, 同じ手段で手に入る.アカウントを取得した上, cactusのnumrelサイトにCVSがアクセス可能になるようにloginする.例えば私の場合,
      cvs -d :pserver:shinkai@cvs.aei.mpg.de:/numrelcvs login
      
      そして例えば
      cvs -d :pserver:shinkai@cvs.aei.mpg.de:/numrelcvs checkout -s
      cvs -d :pserver:shinkai@cvs.aei.mpg.de:/numrelcvs checkout AEIThorns2
      cvs -d :pserver:shinkai@cvs.aei.mpg.de:/numrelcvs checkout AEIDevelopment/Exact
      cvs -d :pserver:shinkai@cvs.aei.mpg.de:/numrelcvs checkout AEIThorns/
      
      (でも実はcvs_anonでもloginできたりして).

  4. お試しテスト:コンパイルと実行

    1. WaveToy編

      まず取り組むべきなのは, Cactusの開発者が提供している「波の伝播デモ」をVPPで再現 できるかどうかを試すことだと思います.デモの詳細は http://www.cactuscode.org/Documentation/WaveToyDemo.html にあります. これに対応するファイルのセットは,前の章のFile_1. File_2b. です. このセットは,flesh+波動方程式で,開発者側が提供 しているもので,相対論部分は全く含みません.

      ================ 実行手順(1)Cのテスト ===============

      Cactusのdirectoryに入り,
      gmake waveC-config
      でconfigureします.
      gmake waveC-thornlist
      でcompileします.thornlistは,最後のCactusWaveをすべて選択してもよいが, C用に必要なもののみ選択してもよい.即ち,
      # arrangement/thorn                # implements (inherits) [friend] {shares}
      #
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      CactusWave/IDScalarWaveC           # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/WaveToyC                # wavetoy (Grid,Boundary) [ ] { }
      
      (2006/11 追記) developer版では,以下のthornlistを選ぶ.
      CactusBase/Boundary                # boundary ( ) [ ] { }
      CactusBase/CartGrid3D              # grid (coordbase) [ ] {driver}
      CactusBase/CoordBase               # CoordBase ( ) [ ] { }
      CactusBase/IOASCII                 # IOASCII ( ) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/LocalInterp             # LocalInterp ( ) [ ] { }
      CactusBase/LocalReduce             # LocalReduce ( ) [ ] { }
      CactusBase/SymBase                 # SymBase ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] {cactus}
      CactusPUGH/PUGH                    # Driver ( ) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp ( ) [ ] { }
      CactusPUGH/PUGHReduce              # Reduce ( ) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab ( ) [ ] { }
      CactusWave/IDScalarWaveC           # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/WaveToyC                # wavetoy (grid) [ ] { }
      
      compileができたなら,パラメータファイルを
      arrangements/CactusWave/WaveToyC/par/wavetoyc_flat.par
      exeにコピーし,exeにできているexeファイルを使って
      cactus_waveC wavetoyc_flat.par
      これで,新しいフォルダ(wavetoyc_flat)ができ,計算結果がoutputされています.

      ================ 実行手順(2)F90のテスト ===============

      Cactusのdirectoryに入り,
      gmake waveF-config
      でconfigureします.
      gmake waveF-thornlist
      でcompileします.thornlistは,同様に,最後のCactusWave内のみ F90用の物を必ず選択する必要があります.即ち,
      # arrangement/thorn                # implements (inherits) [friend] {shares}
      #
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      CactusWave/IDScalarWave            # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/WaveToyF90              # wavetoy (Grid,Boundary) [ ] { }
      
      (2006/11 追記) developer版では,以下のthornlistを選ぶ.
      CactusBase/Boundary                # boundary ( ) [ ] { }
      CactusBase/CartGrid3D              # grid (coordbase) [ ] {driver}
      CactusBase/CoordBase               # CoordBase ( ) [ ] { }
      CactusBase/IOASCII                 # IOASCII ( ) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/LocalInterp             # LocalInterp ( ) [ ] { }
      CactusBase/LocalReduce             # LocalReduce ( ) [ ] { }
      CactusBase/SymBase                 # SymBase ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] {cactus}
      CactusPUGH/PUGH                    # Driver ( ) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp ( ) [ ] { }
      CactusPUGH/PUGHReduce              # Reduce ( ) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab ( ) [ ] { }
      CactusWave/IDScalarWave            # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/WaveToyF90              # wavetoy (grid) [ ] { }
      
      compileができたなら,パラメータファイルを
      arrangements/CactusWave/WaveToyF90/par/wavetoyf90_flat.par
      exeにコピーし,exeにできているexeファイルを使って
      cactus_waveF wavetoyf90_flat.par
      これで,新しいフォルダ(wavetoyf90_flat)ができ,計算結果がoutputされています.

      ================ 実行手順(3)CXXのテスト ===============

      全く同様にC++のテストもできるはずです.

      ================ コンパイル方法について補足 ===============

      Cactusディレクトリ下で,

      gmake xyz-config
      として,システムのconfigureをした後,もういちど
      gmake xyz
      として,実行するプログラム(thornとよばれるモジュール)を選択することに なります.

      パラレルで実行するときには,この時点でMPI nativeにコンパイルする 必要があります.すなわち,
      gmake xyzxyz-config MPI=NATIVE
      gmake xyzxyz
      

      ================ outputされたファイルついて補足 ===============

      defaultでoutputされるファイルは, xgraph というソフトウェアで開くと良いように,最適化されている.xgraphは,linux/SGIで動く. Mac OS Xでも,Xtoolsをインストールしてあればとりあえず可.


    2. 一般相対論コード public編

      開発者の提供する一般相対論コード(簡単な体験版)のミニマムセットは,例えば,arrangementsを すべてダウンロードした後 (これに対応するファイルのセットは,前の章のFile_1. File_2a. です)で,例えばコンパイル時にThornListを次のものに絞れば(IO出力方法を限ってThornListを短くした), 実行してみることができます.

      # arrangement/thorn                # implements (inherits) [friend] {shares}
      #
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/LocalInterp             # LocalInterp ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusEinstein/ADM                 # adm (ADMBase,StaticConformal,CoordGauge,boundary,ADMMacros,Grid) [ ]{grid,time,ADMBase,StaticConformal}
      CactusEinstein/ADMAnalysis         # ADMAnalysis (ADMBase,StaticConformal,Grid,ADMMacros) [ ] {ADMBase}
      CactusEinstein/ADMBase             # ADMBase (grid) [ ] { }
      CactusEinstein/ADMConstraints      # admconstraints (ADMBase,StaticConformal,SpaceMask,grid) [ADMCoupling]{spacemask,ADMBase,StaticConformal}
      CactusEinstein/ADMCoupling         # ADMCoupling ( ) [ ] { }
      CactusEinstein/ADMMacros           # ADMMacros ( ) [ ] { }
      CactusEinstein/AHFinder            # ahfinder (interp,admbase,staticconformal,spacemask,grid,IO) [ ]{IO,grid,admbase,spacemask}
      CactusEinstein/CoordGauge          # CoordGauge ( ) [ ] {ADMBase}
      CactusEinstein/EvolSimple          # simple_adm (admbase,boundary) [ ] {admbase}
      CactusEinstein/Extract             # extract (grid,ADMBase,staticconformal,io) [ ] {grid,io,ADMBase}
      CactusEinstein/IDAnalyticBH        # idanalyticbh (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDAxiBrillBH        # idaxibrillbh (ADMBase,grid,StaticConformal) [ ] {ADMBase}
      CactusEinstein/IDBrillData         # IDBrillData (grid,ADMBase,StaticConformal,ellbase) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDLinearWaves       # idlinearwaves (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDSimple            # IDSimple (ADMBase,StaticConformal,grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/Maximal             # maximal (ADMBase,ellbase,StaticConformal,CoordGauge) [ ] {grid,admbase}
      CactusEinstein/PsiKadelia          # GRscalars (ADMBase,StaticConformal,grid) [ ] {ADMBase}
      CactusEinstein/SpaceMask           # SpaceMask (grid) [ ] { }
      CactusEinstein/StaticConformal     # StaticConformal (grid) [ ] {ADMBase}
      CactusEinstein/TimeGeodesic        # timegeodesic (grid,admbase,staticconformal,coordgauge) [ ]{StaticConformal,admbase,grid}
      CactusElliptic/EllBase             # ellbase ( ) [ ] { }
      CactusElliptic/EllSOR              # ellsor (ellbase,boundary) [ ] {ellbase}
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp (Driver) [ ] { }
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      CactusUtils/NaNChecker             # NaNChecker ( ) [ ] { }
      

      ================ 実行手順 (single processor) ===============

      gmake single-configure
      gmake single-thornlist
      
      例えばパラメータファイル Cactus/arrangements/CactusEinstein/ADM/test/test_ADM_1.parを exeにコピー. exeに移って,
      ./cactus_single test_ADM_1.par
      

      ================ 実行手順 (parallel processor) ===============
      コンパイルは
      gmake mpi-configure MPI=NATIVE
      gmake mpi-thornlist
      
      実行は,exeに移って,(例えばSGI Origin)
      mpirun -np 4 cactus_mpi test_ADM_1.par
      mpirun -np 8 cactus_mpi test_ADM_1.par
      mpirun -np 16 cactus_mpi test_ADM_1.par
      
      などとして,お楽しみ下さい.
      なお,パラメタファイルの中の
      driver::global_nx           = 40
      driver::global_ny           = 40
      driver::global_nz           = 40
      
      は,40x40x40のgrid数を意味します.これを変えれば,巨大計算が楽しめるでしょう.


    3. 一般相対論コード mexico編

      一般の方は関係ありません.すみません.CactusEinsteinの中身はcvsdev版です.2002/7/2更新.

      AEIDevelopment/Exact               # exact (admbase,grid) [ ] {admbase}
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusEinstein/ADM                 # adm (ADMBase,StaticConformal,CoordGauge,boundary,ADMMacros,Grid) [ ] {grid,time,ADMBase,StaticConformal}
      CactusEinstein/ADMAnalysis         # ADMAnalysis (ADMBase,StaticConformal,Grid,ADMMacros) [ ] {ADMBase}
      CactusEinstein/ADMBase             # ADMBase (grid) [ ] { }
      CactusEinstein/ADMConstraints      # admconstraints (ADMBase,StaticConformal,SpaceMask,grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/ADMCoupling         # ADMCoupling ( ) [ ] { }
      CactusEinstein/ADMMacros           # ADMMacros ( ) [ ] { }
      CactusEinstein/CoordGauge          # CoordGauge ( ) [ ] {ADMBase}
      CactusEinstein/EvolSimple          # simple_adm (admbase,boundary) [ ] {admbase}
      CactusEinstein/Extract             # extract (grid,ADMBase,staticconformal,io) [ ] {grid,io,ADMBase}
      CactusEinstein/IDAnalyticBH        # idanalyticbh (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDAxiBrillBH        # idaxibrillbh (ADMBase,grid,StaticConformal) [ ] {ADMBase}
      CactusEinstein/IDBrillData         # IDBrillData (grid,ADMBase,StaticConformal,ellbase) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDLinearWaves       # idlinearwaves (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDSimple            # IDSimple (ADMBase,StaticConformal,grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/Maximal             # maximal (ADMBase,ellbase,StaticConformal,CoordGauge) [ ] {grid,admbase}
      CactusEinstein/PsiKadelia          # GRscalars (ADMBase,StaticConformal,grid) [] {ADMBase}
      CactusEinstein/SpaceMask           # SpaceMask (grid) [ ] { }
      CactusEinstein/StaticConformal     # StaticConformal (grid) [ ] {ADMBase}
      CactusEinstein/TimeGeodesic        # timegeodesic (grid,admbase,staticconformal,coordgauge) [ ] {StaticConformal,admbase,grid}
      CactusElliptic/EllBase             # ellbase ( ) [ ] { }
      CactusElliptic/EllSOR              # ellsor (ellbase,boundary) [ ] {ellbase}
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp (Driver) [ ] { }
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      CactusUtils/NaNChecker             # NaNChecker ( ) [ ] { }
      
      (2002/10/11 更新) 最近少しばかり組み合わせが変わって,
      # arrangement/thorn                # implements (inherits) [friend] {shares}
      #
      AEIThorns/BAM_Elliptic             # BAM_Elliptic (ADMBase,StaticConformal,grid) [ ] {cactus,admbase,StaticConformal,grid,dri
      ver,ellbase}
      AEIThorns/BAM_VecLap               # BAM_VecLap (ADMBase,staticconformal,coordgauge) [BAM_Elliptic] {admbase}
      AEIThorns/Exact                    # exact (admbase,grid,coordgauge) [ADMCoupling] {admbase}
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusEinstein/ADM                 # adm (ADMBase,StaticConformal,CoordGauge,boundary,ADMMacros,Grid) [ ] {grid,time,ADMBase,
      StaticConformal}
      CactusEinstein/ADMAnalysis         # ADMAnalysis (ADMBase,StaticConformal,Grid,ADMMacros,Boundary) [ ] {ADMBase}
      CactusEinstein/ADMBase             # ADMBase (grid) [ ] { }
      CactusEinstein/ADMConstraints      # admconstraints (ADMBase,StaticConformal,SpaceMask,grid) [ADMCoupling] {spacemask,ADMBase
      ,StaticConformal}
      CactusEinstein/ADMCoupling         # ADMCoupling ( ) [ ] { }
      CactusEinstein/ADMMacros           # ADMMacros ( ) [ ] { }
      CactusEinstein/CoordGauge          # CoordGauge ( ) [ ] {ADMBase}
      CactusEinstein/EvolSimple          # simple_adm (admbase,boundary) [ ] {admbase}
      CactusEinstein/Extract             # extract (grid,ADMBase,staticconformal,io) [ ] {grid,io,ADMBase}
      CactusEinstein/IDAnalyticBH        # idanalyticbh (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDBrillData         # IDBrillData (grid,ADMBase,StaticConformal,ellbase) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDLinearWaves       # idlinearwaves (ADMBase,StaticConformal,Grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/IDSimple            # IDSimple (ADMBase,StaticConformal,grid) [ ] {ADMBase,StaticConformal}
      CactusEinstein/Maximal             # maximal (ADMBase,ellbase,StaticConformal,CoordGauge) [ ] {grid,admbase}
      CactusEinstein/PsiKadelia          # GRscalars (ADMBase,StaticConformal,grid) [ ] {ADMBase}
      CactusEinstein/SpaceMask           # SpaceMask (grid) [ ] { }
      CactusEinstein/StaticConformal     # StaticConformal (grid) [ ] {ADMBase}
      CactusEinstein/TimeGeodesic        # timegeodesic (grid,admbase,staticconformal,coordgauge) [ ] {StaticConformal,admbase,grid
      }
      CactusElliptic/EllBase             # ellbase ( ) [ ] { }
      CactusElliptic/EllSOR              # ellsor (ellbase,boundary) [ ] {ellbase}
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp (Driver) [ ] { }
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      


  5. 楕円型solverについて

    5-1. 楕円型solverについて

    楕円型solverをcallするインターフェースプログラムは,CactusElliptic/EllBaseである. 楕円型方程式を解くときには,このプログラムをcallし,パラメータでsolverを指定すれば良い.
    CactusEllipticにはSORが付いてくる.しかし,これは収束が遅いので,実用的ではない. 同じくCactusElliptic/EllPETsCには,バグがあると言われ,使っている者はいない.そこで,2つの解決方法.

    5-2. バーント=ブリュックマン氏作の楕円型solverを使う

    バーント=ブリュックマン氏が作った楕円型solver BAMを使う.利用には彼の許可が必要であるが,コード自身は 上記のAEIThornにてダウンロードできる.これは,ポツダムのグループが実際の数値計算に用いているコードの 一部である.インターフェースプログラムは,CactusElliptic/EllBaseと共通である.

    5-3. エリック=シュネッター氏作の 楕円型solver PETScを使う

    エリック=シュネッター氏は,cactus用にPETScを改良し,フリーで入手できるようになってはいるが, インターフェースプログラムは,CactusElliptic/EllBaseとは別なので,少し使いにくい.

    インストールの手順 (2003/7/18 追記あり)

    • インストールにはbashが必要なので,なければ先にインストールする必要がある.
      (MacOSX 10.2.5 にはbashはすでに標準装備)
    • PETScは,MPIの利用を前提としているので,MPI libraryが必要である.
      • LAM-MPI Package をダウンロードして,インストールする.
        (なんと便利なことにMacOSX 10.2.3以上には,パッケージがready.)
    • PETSc (Portable, Extensible Toolkit for Scientific Computation) をダウンロード
      (2003/7/18追記 PETScの最新versionは2.1.5 http://www-unix.mcs.anl.gov/petsc/petsc-2/index.html)
      インストールのコマンドは、例えば petsc-2.1.5フォルダ が /Users/shinkai にあるとき、
       make PETSC_ARCH=macx PETSC_DIR=/Users/shinkai/petsc-2.1.5 BOPT=g
      
    • Erik Schnetter氏が作っているCactusのthornは,
      cvs -d :pserver:cvs_anon@cvs.cactuscode.org:/arrangements checkout TAT
      
      より入手できる.当然,Cactus/arrangementに入れておく.

    さて,コンパイルの手順であるが,

    • configureの時に,MPI他を認識させねばならない.MacOSXの場合, 次の内容のfileを作って,tatoptionsと名付け,Cactus/に置く.
      SYS_INC_DIRS=/Users/shinkai/petsc-2.1.5/include /Users/shinkai/petsc-2.1.5/bmake/macx
      LIBDIRS=/Users/shinkai/petsc-2.1.5/lib/libg/macx /usr/X11R6/lib /Applications/Absoft/lib
      LIBS=petscfortran petscts petscsnes petscsles petscdm petscmat petscvec petsc lapack blas mpi X11 f90math fio f77math m
      DEBUG=yes
      MPI=LAM
      LAM_DIR=/usr/local/lib/lam
      F90FLAGS=-N11
      
    • configureさせる
      make tat-config options=/Users/shinkai/Cactus/tatoptions
      make tat
      
    • お試しで遊べるThornListは,次の通り.
      # arrangement/thorn                # implements (inherits) [friend] {shares}
      #
      CactusBase/Boundary                # boundary (grid) [ ] { }
      CactusBase/CartGrid3D              # grid ( ) [ ] {driver}
      CactusBase/IOASCII                 # IOASCII (IO,hyperslab) [ ] {IO}
      CactusBase/IOBasic                 # IOBasic (IO) [ ] {IO}
      CactusBase/IOUtil                  # IO ( ) [ ] { }
      CactusBase/Time                    # time ( ) [ ] { }
      CactusElliptic/EllBase             # ellbase ( ) [ ] { }
      CactusElliptic/EllSOR              # ellsor (ellbase,boundary) [ ] {ellbase}
      #CactusElliptic/EllTest             # elltest (grid) [ellbase] { }
      CactusExternal/FlexIO              # FlexIO ( ) [ ] { }
      CactusPUGH/PUGH                    # driver (Cactus) [ ] {cactus}
      CactusPUGH/PUGHInterp              # Interp (Driver) [ ] { }
      CactusPUGH/PUGHReduce              # reduce (driver) [ ] { }
      CactusPUGH/PUGHSlab                # Hyperslab (Driver) [ ] { }
      CactusPUGHIO/IOFlexIO              # IOFlexIO (IO,Hyperslab,FlexIO) [ ] {IO}
      CactusWave/IDScalarWave            # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/IDScalarWaveC           # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/IDScalarWaveCXX         # idscalarwave (wavetoy,grid) [ ] {grid}
      CactusWave/IDScalarWaveElliptic    # idscalarwaveelliptic (grid,wavetoy,ellbase) [ ] {idscalarwave}
      CactusWave/WaveBinarySource        # binarysource (wavetoy,grid,idscalarwave) [ ] { }
      CactusWave/WaveToyC                # wavetoy (Grid,Boundary) [ ] { }
      CactusWave/WaveToyCXX              # wavetoy (Grid,Boundary) [ ] { }
      CactusWave/WaveToyF77              # wavetoy (Grid,Boundary) [ ] { }
      CactusWave/WaveToyF90              # wavetoy (Grid,Boundary) [ ] { }
      CactusWave/WaveToyFreeF90          # wavetoy (Grid,Boundary) [ ] { }
      TAT/AdvectionToy                   # advectiontoy (wavetoy) [ ] { }
      TAT/CheckSync                      # CheckSync (Hyperslab) [ ] { }
      TAT/IDSWTE                         # IDSWTE (WaveToy,IDScalarWave,TATelliptic,boundary,grid) [ ] {IDScalarWave}
      TAT/IDScalarWavePETSc              # IDScalarWavePETSc (WaveToy,TGRelliptic,grid) [ ] {IDScalarWave}
      TAT/NaNCatcher                     # NaNCatcher ( ) [ ] { }
      TAT/TATJacobi                      # TATJacobi (TATelliptic) [ ] { }
      TAT/TATMG                          # TATMG (TATelliptic) [ ] { }
      TAT/TATPETSc                       # TATPETSc (TATelliptic) [ ] { }
      TAT/TATelliptic                    # TATelliptic ( ) [ ] { }
      TAT/TGRPETSc                       # TGRelliptic ( ) [ ] { }
      TAT/always                         # always ( ) [ ] { }
      
    • parameter fileは,
      TAT/IDSWTE/test/charge_te.par
      
      など.

  6. 必要なメモリなど

    4台のパラレルで,いくつか試した結果では,

    • 本格的な一般相対性理論コード(時間発展ADM)を走らせる場合
      grid number            deltax         using memory (*4=total)
      24*24*24    =   13824  (0.25)
      48*48*48    =  110502  (0.125)        480,788 Kbyte *4 = 1.9 Gbyte
      50*50*50    =  125000
      75*75*75    =  421875  (0.08)         535,372 Kbyte *4 = 2.1 Gbyte
      96:96:96    =  884016  (0.0625)       619,816 Kbyte *4 = 2.5 Gbyte    124M  one time step 8 sec
      
      64bit * 50 grid functions * 100^3 = 3.2 GByte

  7. 現在の課題

    課題いろいろ.ポツダムグループがサポートしている thornFlexIOを使う場合,富士通製を用いるとエラーが生じる.

    テクニカルな問題は,英語で質問 cactusmaint@cactuscode.org へ. 翌日にはリプライが得られます.

    Cactusコードに関する資料ですが,Cactusコードのホームページ http://www.cactuscode.org/Showcase/Presentations.html の他,最新(2002/5)の,彼らの説明資料が, http://www.aei.mpg.de/%7Eshawley/Mexico/gab_slides.ppt からもダウンロード可能です.


Go back to the top page of or
My current Email address is