「2Decomp&FFT」( http://www.2decomp.org/download.html ) という FFT を実行するために Fortran ライブラリを使用しようとしています。このライブラリには FFT エンジンが組み込まれており、私のコードで問題なく動作します。組み込みエンジンの代わりに、このライブラリで FFTW3 エンジンを使用するには、次のように説明されています。
2DECOMP で 'src/Makefile.inc' ファイルを編集し、FFT エンジンを 'FFT=fftw3' に変更します。また、FFTW インストールを指すように、同じファイルに FFTW_PATH 変数を設定する必要があります。次に、すべてを再コンパイルします。
ローカル Mac に FFTW3.3 をインストールし、指示に従ってライブラリを再コンパイルしました。ただし、その後、ライブラリを使用してコードをコンパイルしようとすると、リンク中に次のエラーが発生します。
Undefined symbols for architecture x86_64:
"_dfftw_destroy_plan_", referenced from:
___decomp_2d_fft_MOD_decomp_2d_fft_finalize in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_", referenced from:
___decomp_2d_fft_MOD_c2c_1m_z in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_x in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_y in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_c2r_", referenced from:
___decomp_2d_fft_MOD_c2r_1m_x in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_fft_3d_c2r in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_execute_dft_r2c_", referenced from:
___decomp_2d_fft_MOD_fft_3d_r2c in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_", referenced from:
___decomp_2d_fft_MOD_c2c_1m_z_plan in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_x_plan in lib2decomp_fft.a(fft_fftw3.o)
___decomp_2d_fft_MOD_c2c_1m_y_plan in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_c2r_", referenced from:
___decomp_2d_fft_MOD_init_fft_engine in lib2decomp_fft.a(fft_fftw3.o)
"_dfftw_plan_many_dft_r2c_", referenced from:
___decomp_2d_fft_MOD_init_fft_engine in lib2decomp_fft.a(fft_fftw3.o)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Sora_v71] Error 1
このライブラリを呼び出す、私が書いた最小限のコードを次に示します。
use decomp_2d
use decomp_2d_fft
integer n, pr, pc
call decomp_2d_init(n,n,n,pr,pc)
call decomp_2d_fft_init
stop
end
これが私が使用しているMakefileです(DECOMP2Dは、ライブラリを含むフォルダーに設定された環境変数です):
## ------------------------------------------------------------------------
# Lines included for using the 2decomp libraries
INC_2DECOMP = -I$(DECOMP2D)/include/
LIB_2DECOMP = -L$(DECOMP2D)/lib/ -l2decomp_fft
## ------------------------------------------------------------------------
RM = rm
SRCDIR = .
LIBDIR = .
BIN = a.out
OBJS = main.o
## ------------------------------------------------------------------------
# default command for compiler, linker
FC = mpif90
FFLAGS = $(F90FLAG) $(INC_2DECOMP)
LFLAGS = $(F90FLAG) $(LIB_2DECOMP) -L$(LIBDIR)
## ------------------------------------------------------------------------
# default action
all: $(BIN)
$(BIN): $(OBJS)
@echo Linking $(BIN) .....
$(FC) $(OBJS) $(LFLAGS) $(FFLAGS) -o $@
.f.o:
@echo Compiling $*.f
$(FC) $(LFLAGS) $(FFLAGS) -c $(SRCDIR)/$*.f
clean:
@echo 'Cleaning .....'
$(RM) -f core *.o *~ *.L *.O $(BIN) $(SIZE_FILE)