FDS ifort - eiichiromomma/CVMLAB GitHub Wiki

(FDS4) ifort

Intel製Fortran CompilerでFDSをビルドし直す。

Fortran Compilerの導入

IntelFortranCompilerを参照。

ソースの入手

http://www.fire.nist.gov/fds/のDownloadsでFDS Source Filesとして配布されている。

ビルド(Makefile使用)

展開、移動してビルド環境を設定する。

tar xf fds4_07_source.tar
cd SOURCE_4.07/
source /opt/intel/cce/9.0/bin/iccvars.sh
source /opt/intel/fce/9.0/bin/ifortvars.sh

以下の内容のMakefileを同じ場所に作成。

# Makefile for Lahey Fortran and Gnu C on RedHat Linux

FFLAGS     = -O3 -i-static
CFLAGS     = -O3 -Dpp_noappend
obj     = fds4_icc
FCOMPL  = LC_ALL=C ifort
CCOMPL  = LC_ALL=C icc

.SUFFIXES:
.SUFFIXES: .c .f .o

.f.o:
        $(FCOMPL) -c $(FFLAGS) $<
.c.o:
        $(CCOMPL) -c $(CFLAGS) $<

OBJECTS = mods.o \
          pois.o misc.o radi.o sprk.o \
          dump.o read.o mass.o  pres.o \
          divg.o init.o  \
          isob.o velo.o  main.o \

APPLIC: $(INLINE1) $(INLINE2) $(OBJECTS)
        $(FCOMPL) $(FFLAGS) -o $(obj) $(OBJECTS)

INLINE1 = mods.f
INLINE2 = pois.f misc.f radi.f
INLINE3 = divg.f init.f dump.f sprk.f read.f mass.f pres.f velo.f

mods.o : mods.f
pois.o : pois.f $(INLINE1)
misc.o : misc.f $(INLINE1)
radi.o : radi.f $(INLINE1)
sprk.o : sprk.f $(INLINE1)
divg.o : divg.f $(INLINE1)
mass.o : mass.f $(INLINE1) $(INLINE2)
init.o : init.f $(INLINE1) $(INLINE2)
read.o : read.f $(INLINE1)
pres.o : pres.f $(INLINE1) $(INLINE2)
velo.o : velo.f $(INLINE1)
dump.o : dump.f $(INLINE1) $(INLINE2)
main.o : main.f $(INLINE1) $(INLINE2) $(INLINE3)
isob.o : isob.c

あとは

make

とするだけ。

Makefileはこちら

ビルド(旧)

展開、移動してビルド環境を設定する。

tar xf fds4_07_source.tar
cd SOURCE_4.07/
source /opt/intel/cce/9.0/bin/iccvars.sh
source /opt/intel/fce/9.0/bin/ifortvars.sh

いよいよコンパイル。

とりあえずmpiの方は結果が境界で反転したり怪しいので外す。

rm main_mpi.f

Fortran95はズブの素人なのだが.fファイルにmoduleとして宣言されているのをコンパイルすると.modファイルがボコボコ発生するらしい。 その.modファイルをuseでincludeするようになっており、FDSのソースは.modの依存関係が存在する。 ifort用のMakefileは存在せず、移植するのも面倒なので取り敢えず片っ端からコンパイルしてしまう。

LC_ALL=C ifort *.f -c

を3回繰り返せばmain以外のエラーは出なくなる(筈)。

続けてisob.cをコンパイル。pp_noappendを定義しておく。

LC_ALL=C icc -Dpp_noappend -c isob.c

必要なファイルは全て揃ったのでfds4_iccの完成。

LC_ALL=C ifort main.f *.o -i-static -o fds4_icc

ifortのオプションで -i-static を付けておくとstatic linkになるのでIntel Compilerの無い環境でも使える。

Intel Fortranの威力

配布されていたfds4_linux。

time ../fds4_linux < silly4.data
real    0m27.248s
user    0m27.078s
sys     0m0.168s

そして今回作成したfds4_icc

time ../fds4_icc < silly4.data
real    0m17.354s
user    0m17.001s
sys     0m0.264s

AthronX2でも目に見えて速くなった。 EM64TのXeonだと20s→10s。