# Makefile for test files
THREAD_STAT := 1

MAKEINC = ../../..
include $(MAKEINC)/Make.Std

IDIR = ..
LDIR = ..
#LIBS = -ldouble -lm

TARGETS = correctness correctness_double correctness_float tensortest cost testsolve testsolve_dbl test_tbci test_tbci_scale test_tsmat test_transpose pthread_test test_smp test_smp_nosimd test_smp_std_complex test_tsfabs test_bd bench_bracket divmat unaligned push_back ibmbench_t ibmbench_t_plain test_matrix test_matrix2 test_matrix3 test_malloc_smp 
ifeq ($(ARCH),x86_64)
TARGETS += test_sum test_sum_nosmp
endif
IBMTARGETS = ibmbench_m ibmbench_b ibmbench_p
LAPACKTARGETS = test_lapack_eig test_lapack_eig_g2c
SIMDTARGETS = correctness_double_simd correctness_float_simd ibmbench_t_simd
F2CTARGETS = bessel
ALLTARGETS = $(TARGETS) $(IBMTARGETS) $(F2CTARGETS) $(LAPACKTARGETS) $(SIMDTARGETS)

MYSMPOBJ = $(patsubst $(SYSDEP)/%,%,$(SMPOBJ))
SYSARCH := $(patsubst bin-%,%,$(SYSDEP))
SYSARCH := $(patsubst ix86,i386,$(SYSARCH))
SUPERLU_OBJS = superlu_d.o superlu_z.o superlu_stdcplx.o

ifndef NO_TBCICONFIG
DEFINES += -DHAVE_TBCICONFIG_H -I $(IDIR)
endif

#DEFINES += -DWARN_UNALIGNED=1

POOMADIR = $(HOME)/Physics/freepooma-2.4.1
POOMASUITE = LINUXgcc

default: $(TARGETS)

simd: $(SIMDTARGETS) $(TARGETS)

ibmbench: $(IBMTARGETS)

lapack: test_lapack_eig
lapack_g: test_lapack_eig_g2c

# TODO -- Real dependency tracking

%: %.o $(MYSMPOBJ)
	$(CXX) $(LFLAGS) -o $@ $^ -L$(LDIR) $(LIBS) $(SMPLIB)

%.o: %.cc $(IDIR)/tbci/*.h 
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<

%.o: %.cpp $(IDIR)/tbci/*.h 
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<

#%: %.cc $(MYSMPOBJ) $(IDIR)/tbci/*.h 
#	$(CXX) $(CXXFLAGS) $(DEFINES) $< -o $@ -L$(LDIR) $(LIBS) $(MYSMPOBJ) $(SMPLIB)
#
#%: %.cpp $(MYSMPOBJ) $(IDIR)/tbci/*.h 
#	$(CXX) $(CXXFLAGS) $(DEFINES) $< -o $@ -L$(LDIR) $(LIBS) $(MYSMPOBJ) $(SMPLIB)

cost: cost.o #$(MYSMPOBJ)

tensortest: tensortest.o $(MYSMPOBJ)

divmat: divmat.o $(MYSMPOBJ)

test_tbci: test_tbci.cc
	$(CXX) $(LFLAGS) -o $@ $(CXXFLAGS) $(DEFINES) $^ 

test_tbci_scale: test_tbci_scale.cc
	$(CXX) $(LFLAGS) -o $@ $(CXXFLAGS) $(DEFINES) $^ 

pthread_test: pthread_test.c
	$(CC) $(EXTRA_CFLAGS) -O2 -D_REENTRANT $< -o $@ -lpthread

test_sum: test_sum.o $(MYSMPOBJ)

test_sum_nosimd.o: test_sum.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DWARN_SSE -DTBCI_NO_SIMD -c $< -o $@

test_sum.o: test_sum.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) -msse2 $(DEFINES) -DWARN_SSE -c $< -o $@

test_sum_float.o: test_sum.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) -msse2 $(DEFINES) -DWARN_SSE -DTYPE="float" -DTYPESTR="\"float\"" -DTS_FLOAT -c $< -o $@

test_sum_std_complex.o: test_sum.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) -msse2 $(DEFINES) -DWARN_SSE -DTYPE="std::complex<double>" -DTYPESTR="\"complex<double>\"" -DCPLX -include "tbci/std_cplx.h" -c $< -o $@

test_sum_nosmp.o: test_sum.cc $(IDIR)/tbci/*.h
	$(CXX) $(CFLAGS) -msse2 -O2 -Wall -DWARN_SSE -DNO_SMP -I$(IDIR) -c $< -o $@

test_sum_nosmp: test_sum_nosmp.o
	$(CXX) $(LFLAGS) -o $@ $^ -L$(LDIR) $(LIBS)

test_smp_nosimd.o: test_smp.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DSMP -DTBCI_NO_SIMD -c $< -o $@

test_smp.o: test_smp.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DSMP -DWARN_UNALIGNED -c $<

test_smp_float.o: test_smp.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DSMP -DWARN_UNALIGNED -DTYPE="float" -DTYPESTR="\"float\"" -DMAXERR="5e-6" -c $< -o $@

test_smp_std_complex.o: test_smp.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DSMP -DWARN_UNALIGNED -DCPLX -DTYPE="std::complex<double>" -D TYPESTR="\"complex<double>\"" -include "tbci/std_cplx.h" -c $< -o $@

test_smp: test_smp.o smp.o
	$(CXX) $(LFLAGS) -o $@ $^ -L$(LDIR) $(LIBS) $(SMPLIB) 

smp.o: ../source/smp.cc $(IDIR)/tbci/smp.h $(IDIR)/tbci/basics.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DSMP -DTHREAD_STAT -c $<

test_bd: test_bd.o smp.o
	$(CXX) $(LFLAGS) -o $@ $^ -L$(LDIR) $(LIBS) $(SMPLIB)

ibmbench_m: ibmbench_m.c
	$(CC) $(CFLAGS) $(DEFINES) -Imeschach -o $@ $^ meschach/meschach.a 

ibmbench_p: ibmbench_p.cc
	$(CXX) $(CXXFLAGS) $(DEFINES) -I$(POOMADIR)/src -I$(POOMADIR)/lib/$(POOMASUITE) -o $@ $^ $(POOMADIR)/lib/$(POOMASUITE)/libpooma*.a

CFLAGS_ibmbench_t = -DWARN_SSE -DTBCI_NO_SIMD

ibmbench_t_simd: ibmbench_t.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DWARN_SSE -DTBCI_SIMD_SUM -o $@ $< -L$(LDIR) $(LIBS) $(MYSMPOBJ) $(SMPLIB)

ibmbench_t_plain: ibmbench_t.cc $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DUSE_PLAIN_VEC_KERNELS $(CFLAGS_ibmbench_t) -o $@ $< -L$(LDIR) $(LIBS) $(MYSMPOBJ) $(SMPLIB)

ibmbench_t: ibmbench_t.o

ibmbench_b: ibmbench_b.cc
	$(CXX) $(CXXFLAGS) $(DEFINES) -I. -o $@ $^ 

bessel.o: bessel.cpp $(IDIR)/tbci/specfun.h $(IDIR)/tbci/specfun_stdcplx.h $(IDIR)/tbci/cplx.h $(IDIR)/tbci/std_cplx.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<

#bessel: bessel.o 
#	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -ltbcilapack -ltbcicplxdouble -ltbcistdcomplexdouble -ltbcidouble -llapack -lblas -lg2c

bessel: bessel.o
	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -ltbcispecfun -lf2c

testsolve: testsolve.o $(MYSMPOBJ)

testsolve_dbl: testsolve_dbl.o $(MYSMPOBJ)

testsolve_superlu: testsolve_superlu.o $(MYSMPOBJ) $(SUPERLU_OBJS)
	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -lsuperlu -lblas2

testsolve_dbl_superlu: testsolve_dbl_superlu.o $(MYSMPOBJ) $(SUPERLU_OBJS)
	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -lsuperlu -lblas2

testsolve.o: testsolve.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DWARN_UNALIGNED -c $<

testsolve_dbl.o: testsolve_dbl.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<

testsolve_superlu.o: testsolve.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) -DTEST_SUPERLU $(DEFINES) -o $@ -c $<

testsolve_dbl_superlu.o: testsolve_dbl.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) -DTEST_SUPERLU $(DEFINES) -o $@ -c $<

test_transpose: test_transpose.o $(MYSMPOBJ)

test_tsfabs: test_tsfabs.o $(MYSMPOBJ)

test_tsmat: test_tsmat.o $(MYSMPOBJ)

test_matrix: test_matrix.o $(MYSMPOBJ)

test_matrix2: test_matrix2.o $(MYSMPOBJ)

test_matrix3: test_matrix3.o $(MYSMPOBJ)

test_malloc_smp: test_malloc_smp.o $(MYSMPOBJ)

bench_bracket: bench_bracket.o $(MYSMPOBJ)

unaligned: unaligned.o 

superlu_d.o: ../interface/superlu_d.cpp
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<
	
superlu_z.o: ../interface/superlu_z.cpp
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<
	
superlu_stdcplx.o: ../interface/superlu_stdcplx.cpp
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<
	
correctness_double.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DWARN_UNALIGNED  -DTBCI_NO_SIMD -DTYPE=double -DTYPESTR="\"double\"" -I$(IDIR) -c $< -o $@

correctness_float.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -DWARN_UNALIGNED  -DTBCI_NO_SIMD -DTYPE=float -DTYPESTR="\"float\"" -I$(IDIR) -c $< -o $@

correctness: correctness.o $(MYSMPOBJ)

correctness_double: correctness_double.o $(MYSMPOBJ)

correctness_float: correctness_float.o $(MYSMPOBJ)

correctness_double_simd.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES)  -msse2 -DWARN_UNALIGNED -DTBCI_SIMD_SUM -DWARN_SSE -DTYPE=double -DTYPESTR="\"double (SSE2)\"" -c $< -o $@

correctness.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES)  -DTBCI_SIMD_SUM -DWARN_SSE -c $< -o $@

correctness_float_simd.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES)  -msse2 -DWARN_UNALIGNED -DTBCI_SIMD_SUM -DWARN_SSE -DTYPE=float -DTYPESTR="\"float (SSE)\"" -c $< -o $@

correctness_double_simd: correctness_double_simd.o $(MYSMPOBJ)

correctness_float_simd: correctness_float_simd.o $(MYSMPOBJ)

correctness_double_simd_nosum.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES)  -msse2 -DWARN_UNALIGNED -DWARN_SSE -DTYPE=double -DTYPESTR="\"double (SSE2)\"" -c $< -o $@

correctness_float_simd_nosum.o: correctness.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES)  -msse2 -DWARN_UNALIGNED -DWARN_SSE -DTYPE=float -DTYPESTR="\"float (SSE)\""  -c $< -o $@

correctness_double_simd_nosum: correctness_double_simd_nosum.o $(MYSMPOBJ)

correctness_float_simd_nosum: correctness_float_simd_nosum.o $(MYSMPOBJ)

push_back: push_back.o $(MYSMPOBJ)

test_lapack_eig.o: test_lapack_eig.cpp $(IDIR)/tbci/*.h
	$(CXX) $(CXXFLAGS) $(DEFINES) -c $<

test_lapack_eig: test_lapack_eig.o
	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -Wl,-rpath-link,$(LDIR) -ltbcilapack -llapack -lblas -lgfortran -Wl,-Bstatic -lf2c -Wl,-Bdynamic

test_lapack_eig_g2c: test_lapack_eig.o
	$(CXX) $(LFLAGS) -o $@ $^ -L $(LDIR) -Wl,-rpath-link,$(LDIR) -ltbcilapack -llapack -lblas -lg2c

clean: 
	rm -f core $(ALLTARGETS) $(patsubst %,%.o,$(ALLTARGETS)) $(MYSMPOBJ)
