Code_Aster のコンパイル

2011年7月30日

はじめに

Code_Aster は、フランス EDF が公開しているオープンソースの構造解析ソルバーである。

使用環境

Code_Aster 10.3.0-3、openSUSE 11.3 x86_64

Code_Aster のコンパイル

ソースパッケージの入手

ソースパッケージ (ここでは aster-full-src-10.3.0-3.noarch.tar.gz) を Code_Aster のページ からダウンロードする。

パッケージを展開。

$ tar xvzf aster-full-src-10.3.0-3.noarch.tar.gz -C ~/

事前準備

Code_Aster のコンパイル・利用に下記のものが必要なので用意する。

  • C/C++ コンパイラ (gcc, g++)
  • Fortran コンパイラ (gfortran)
  • BLAS (blas)
  • LAPACK (lapack)
  • Python
  • Python Numpy モジュール (python-numpy-devel)
  • Python Qt 4 モジュール (python-qt4-devel)
  • Motif 互換ライブラリ (openmotif)

コンパイル

Code_Aster のディレクトリに移動。

$ cd ~/aster-full-src-10.3.0

setup.cfg を環境に合わせて修正し、コンパイルを開始。

$ mkdir ~/aster
$ python setup.py install --prefix=$HOME/aster

ここでは setup.cfg は書き換えず、"--prefix" でインストール先を指定している。ここでは "~/aster" にインストールしている。

途中で質問されるので "y" と入力する。

コンパイル後の設定

下記を ~/.bashrc に追加。

export ASTER_ROOT=~/aster
export PATH=~/aster/bin:~/aster/outils:$PATH

~/.bashrc の読み込み。

$ . ~/.bashrc

テスト

サンプルケースを実行。

$ cd ~/aster/STA10.3
$ as_run forma01a.export

"DIAGNOSTIC JOB : OK" というメッセージが出れば OK。

ASTK, EFICAS の起動も確認。

$ astk
$ eficas

並列版のコンパイル

Code_Aster は標準では並列計算に対応していない。並列計算版を別途コンパイルする必要がある。

事前準備

並列版 Code_Aster のコンパイルのために以下のものを用意する。

  • 非並列版 Code_Aster (上でコンパイルしたもの)
  • Open MPI
  • ScaLAPACK
  • ParMETIS
  • 並列版 MUMPS

Open MPI のコンパイル

Open MPI のページ からパッケージを入手し、コンパイル。

$ tar xvjf openmpi-1.4.3.tar.bz2 -C ~/
$ cd openmpi-1.4.3
$ mkdir ~/aster/public/openmpi-1.4.3
$ ./configure --prefix=$HOME/aster/public/openmpi-1.4.3
$ make
$ make install

以下を ~/.bashrc に追加する。

export PATH=~/aster/public/openmpi-1.4.3/bin:$PATH
LD_LIBRARY_PATH=~/aster/public/openmpi-1.4.3/lib:$LD_LIBRARY_PATH
OPAL_PREFIX=~/aster/public/openmpi-1.4.3

~/.bashrc の読み込み。

$ . ~/.bashrc

テスト。

$ cd ~/openmpi-1.4.3/examples
$ make
$ mpirun -np 2 hello_c

ScaLAPACK のコンパイル

ここ から ScaLAPACK のパッケージをダウンロード、コンパイル。

$ tar xvzf scalapack_installer.tgz -C ~/
$ cd ~/scalapack_installer_0.96
$ mkdir ~/aster/public/scalapack
$ ./setup.py --prefix=$HOME/aster/public/scalapack --f90=gfortran --downblas --downblacs --downlapack
オプション "--downblas" などは、BLAS などを Web からダウンロードしてコンパイルすることを指示している。

コンパイルが済んだら以下を実行。

$ cd ~/aster/public/scalapack/lib
$ ln -s blacs.a libblacs.a
$ ln -s blacsC.a libblacsC.a
$ ln -s blacsF77.a libblacsF77.a

ParMETIS のコンパイル

ParMETIS のページ から ParMETIS のパッケージを入手し、展開。

$ tar xvzf ParMetis-3.2.0.tar.gz -C ~/
$ cd ~/ParMetis-3.2.0

Makefile.in をエディタで開き、"XTRALIBS = " に "-lmpi" を追加。

コンパイル。

$ make

コンパイルが済んだら、ライブラリをコピー。

$ mkdir ~/aster/public/ParMetis-3.2.0/lib
$ cp *.a ~/aster/public/ParMetis-3.2.0/lib

MUMPS の再コンパイル

Code_Aster のソースパッケージから MUMPS のソースパッケージを展開。

$ cd ~/aster-full-src-10.3.0/SRC
$ tar xvzf mumps-4.9.2.tar.gz -C ~/
$ mv ~/mumps-4.9.2 ~/aster/public/mumps-4.9.2_mpi
$ cd ~/aster/public/mumps-4.9.2_mpi

Makefile.inc をもとの mumps-4.9.2 からコピー。

$ cp ../mumps-4.9.2/Makefile.inc .

Makefile.inc を並列用に修正。

$ diff ../mumps-4.9.2/Makefile.inc Makefile.inc
39c39,40
< LMETISDIR = /home/adelie/aster/public/metis-4.0/lib
---
> #LMETISDIR = /home/adelie/aster/public/metis-4.0/lib
> LMETISDIR = /home/adelie/aster/public/ParMetis-3.2.0/lib
48,49c49,50
< LMETIS    = -L$(LMETISDIR) -lmetis
< #LMETIS    = -L$(LMETISDIR) -lparmetis -lmetis
---
> #LMETIS    = -L$(LMETISDIR) -lmetis
> LMETIS    = -L$(LMETISDIR) -lparmetis -lmetis
54c55,56
< ORDERINGSF  = -Dpord -Dmetis
---
> #ORDERINGSF  = -Dscotch -Dpord -Dmetis
> ORDERINGSF  = -Dpord -Dmetis -Dparmetis -Dmetis
67,69c69,74
< CC      = /usr/bin/gcc
< FC      = /usr/bin/gfortran
< FL      = /usr/bin/gfortran
---
> #CC      = /usr/bin/gcc
> #FC      = /usr/bin/gfortran
> #FL      = /usr/bin/gfortran
> CC      = mpicc
> FC      = mpif77
> FL      = mpif90
72a78,82
> #
> SCALAP = -L$(HOME)/aster/public/scalapack/lib -lscalapack -lblacs -lblacsF77 -lblacsC -lblacs -lblacsF77 -lblacsC
> INCPAR = -I$(HOME)/aster/public/openmpi-1.4.3/include
> LIBPAR = $(SCALAP) -L$(HOME)/aster/public/openmpi-1.4.3/lib -lmpi
> #
87,89c97,102
< INC = $(INCSEQ)
< LIB = $(LIBSEQ)
< LIBSEQNEEDED = libseqneeded
---
> #INC = $(INCSEQ)
> #LIB = $(LIBSEQ)
> #LIBSEQNEEDED = libseqneeded
> INC = $(INCPAR)
> LIB = $(LIBPAR)
> LIBSEQNEEDED = 

コンパイル。

$ make alllib

並列版 Code_Aster のコンパイル

並列版のディレクトリ PAR10.3 を作成。

$ cd ~/aster
$ cp -r STA10.3 PAR10.3
$ cd PAR10.3

PAR10.3/profile.sh の "mumps-4.9.2" を "mumps-4.9.2_mpi" に書き換える。

PAR10.3/config.txt を修正。

$ diff ../STA10.3/config.txt config.txt
46c46,49
< BIBL           | mumps   | ?     | /home/adelie/aster/public/mumps-4.9.2/lib/libdmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libzmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libsmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libcmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libmumps_common.a /home/adelie/aster/public/mumps-4.9.2/lib/libpord.a /home/adelie/aster/public/mumps-4.9.2/lib/libmpiseq.a -L/home/adelie/aster/public/metis-4.0/lib -lmetis
---
> #BIBL           | mumps   | ?     | /home/adelie/aster/public/mumps-4.9.2/lib/libdmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libzmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libsmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libcmumps.a /home/adelie/aster/public/mumps-4.9.2/lib/libmumps_common.a /home/adelie/aster/public/mumps-4.9.2/lib/libpord.a /home/adelie/aster/public/mumps-4.9.2/lib/libmpiseq.a -L/home/adelie/aster/public/metis-4.0/lib -lmetis
> BIBL           | mumps   | ?     | -L/home/adelie/aster/public/mumps-4.9.2_mpi/lib -ldmumps -lzmumps -lsmumps -lcmumps -lmumps_common -lpord
> BIBL           | metis   | ?     | -L/home/adelie/aster/public/ParMetis-3.2.0/lib -lparmetis -lmetis
> BIBL           | scalap  | ?     | -L/home/adelie/aster/public/scalapack/lib -lscalapack -lblacs -lblacsF77 -lblacsC -lblacs -lblacsF77 -lblacsC
49c52,53
< BIBL           | mpi     | 2     | 
---
> #BIBL           | mpi     | 2     | 
> BIBL           | mpi     | 2     |  -L/home/adelie/aster/public/openmpi-1.4.3/lib -lmpi
53c57,58
< DEFS           | defined | ?     | LINUX64 _HAVE_MUMPS
---
> #DEFS           | defined | ?     | LINUX64 _HAVE_MUMPS
> DEFS           | defined | ?     | LINUX64 _HAVE_MUMPS _USE_OPENMP _USE_MPI _USE_MPI_MUMPS _USE_MPI_FETI
59c64,65
< LINK           | link    | ?     | /usr/bin/gfortran
---
> #LINK           | link    | ?     | /usr/bin/gfortran
> LINK           | link    | ?     | mpif90
62c68,69
< CC             | cc      | ?     | /usr/bin/gcc
---
> #CC             | cc      | ?     | /usr/bin/gcc
> CC             | cc      | ?     | mpicc
65c72,73
< INCL           | include | ?     | -I/home/adelie/aster/STA10.3/bibc/include -I/usr/include/python2.6 -I/usr/lib64/python2.6/site-packages/numpy/core/include -I/home/adelie/aster/public/hdf5-1.6.9/include -I/home/adelie/aster/public/scotch_4.0/include
---
> #INCL           | include | ?     | -I/home/adelie/aster/STA10.3/bibc/include -I/usr/include/python2.6 -I/usr/lib64/python2.6/site-packages/numpy/core/include -I/home/adelie/aster/public/hdf5-1.6.9/include -I/home/adelie/aster/public/scotch_4.0/include
> INCL           | include | ?     | -I/home/adelie/aster/PAR10.3/bibc/include -I/usr/include/python2.6 -I/usr/lib64/python2.6/site-packages/numpy/core/include -I/home/adelie/aster/public/hdf5-1.6.9/include -I/home/adelie/aster/public/scotch_4.0/include
67c75,76
< F77            | f77     | ?     | /usr/bin/gfortran
---
> #F77            | f77     | ?     | /usr/bin/gfortran
> F77            | f77     | ?     | mpif77
72c81,82
< F90            | f90     | ?     | /usr/bin/gfortran
---
> #F90            | f90     | ?     | /usr/bin/gfortran
> F90            | f90     | ?     | mpif90
75c85,86
< INCLF90        | include | ?     |  -I/home/adelie/aster/STA10.3/bibf90/include_mumps-4.9.2
---
> #INCLF90        | include | ?     |  -I/home/adelie/aster/STA10.3/bibf90/include_mumps-4.9.2
> INCLF90        | include | ?     |  -I/home/adelie/aster/PAR10.3/bibf90/include_mumps-4.9.2_mpi
113,114c124,127
< REPMAT         | exec    | 02-05 | /home/adelie/aster/STA10.3/materiau
< REPDEX         | exec    | 02-05 | /home/adelie/aster/STA10.3/datg
---
> #REPMAT         | exec    | 02-05 | /home/adelie/aster/STA10.3/materiau
> #REPDEX         | exec    | 02-05 | /home/adelie/aster/STA10.3/datg
> REPMAT         | exec    | 02-05 | /home/adelie/aster/PAR10.3/materiau
> REPDEX         | exec    | 02-05 | /home/adelie/aster/PAR10.3/datg

コンパイル。

$ as_run --vers=PAR10.3 --make clean
$ as_run --vers=PAR10.3 --make clean bibf90/mumps
$ as_run --vers=PAR10.3 --make

コンパイル後の設定

計算ノードリストを作成。

~/aster/etc/codeaster/aster-mpihosts

node01 slots=4

"slots=" でノードの CPU コア数を指定する。

~/aster/etc/codeaster/asrun で計算環境の設定を行う。"mpi_get_procid_cmd" を Open MPI 用に書き換える。

mpi_get_procid_cmd : echo $OMPI_MCA_orte_ess_vpid

ノード数と最大 CPU コア数 (全ノードの CPU コア数の和) を指定。

mpi_nbnoeudmax : 1
mpi_nbcpumax : 4

また、~/aster/etc/codeaster/aster の最後に "vers : PAR10.3" を追加する。こうしておくと、ASTK で並列版を選択できる。

コンパイル後の設定 2

~/aster/share/codeaster/asrun/data/mpirun_template の "TMPDIR" を "TMPDIRL" などと別名に変える。こうしないと設定ファイルの解釈時にプログラムが固まった。どうやら Open MPI の問題らしい。たとえば、openmpi-1.4.3/examples の中で以下のようなシェルスクリプト "hello_c_test" を作る。

#!/bin/sh

PROCID=`echo $OMPI_MCA_orte_ess_vpid`
TMPDIR=/tmp/test.proc.$PROCID

./hello_c

これを mpirun で実行すると、固まる。

$ mpirun -np 2 ./hello_c_test

TMPDIR の内容が並列プロセスごとに異なっていると、MPI 用プログラムの実行時に問題になるらしい。

コンパイル後の設定 3

~/aster/etc/codeaster/profile.sh の以下の行をコメントにしないと ASTK が起動しなかった。

export WISHEXECUTABLE=/home/adelie/SALOME-MECA-2011.1-x86_64/SALOME-MECA/Prerequis/TclTk8.4.12/bin/wish8.4

コンパイル後の設定 4

~/.bashrc に設定した Open MPI 用の設定を ~/aster/PAR10.03 の profile.sh に移動する。

export PATH=~/aster/public/openmpi-1.4.3/bin:$PATH
LD_LIBRARY_PATH=~/aster/public/openmpi-1.4.3/lib:$LD_LIBRARY_PATH
OPAL_PREFIX=~/aster/public/openmpi-1.4.3

これは OpenFOAM の Open MPI との干渉を避けるための処置。OpenFOAM を使っておらず、Open MPI を Code_Aster 以外で使うならば ~/.bashrc に設定したままでもよいが、その場合は Open MPI を別の場所にインストールしたほうがよいかもしれない。

テスト

~/aster/PAR10.3 の forma01a.export, astout.export の "STA10.3" を "PAR10.3" に書き換える (気分の問題)。forma01a.export で以下を設定。

P ncpus 1
P mpi_nbcpu 2
P mpi_nbnoeud 1

"ncpus" は OpenMP による 1 ノード内の並列数。"mpi_nbcpu"、"mpi_nbnoeud" は MPI の設定で、"mpi_nbcpu" で並列数、"mpi_nbnoeud" でノード数を指定する。

実行。

$ as_run forma01a.export

"mpi_nbcpu" を 2 より大きくするとエラーになった。設定がまずいらしい。とりあえず動くことが確認できれば OK。