TAU = 0

CXX = g++
MPICXX = mpic++
LD = g++
MPILD = mpic++

ifeq ($(TAU),1)
	TAUDIR = $(HOME)/logiciels/tau-2.29/x86_64
	TAUOPT = -DTAUPROF -I$(TAUDIR)/../include
	TAULIB = -L$(TAUDIR)/lib -lTAU

	MPICXX = tau_cxx.sh
	CXX = tau_cxx.sh
	LD = tau_cxx.sh
	MPILD = tau_cxx.sh
#	export TAU_MAKEFILE=$(TAUDIR)/lib/Makefile.tau-papi-mpi-pdt-openmp
else
	TAUOPT =
	TAULIB =
endif

CFLAGS = -Wall -g -O3  -Wno-unused-variable -std=c++17 $(TAUOPT) -DSCATTERGATHER
LDOPT =  -lmpfr -lgmp -lpthread -pthread -lobake -lmp++ -ltbb -labsl_hashtablez_sampler -labsl_hash -labsl_city -labsl_synchronization -labsl_exponential_biased -labsl_base -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_symbolize -labsl_graphcycles_internal -labsl_debugging_internal -labsl_malloc_internal -labsl_demangle_internal -labsl_time -labsl_int128 -labsl_time_zone -labsl_stacktrace -labsl_debugging_internal -labsl_raw_hash_set -labsl_dynamic_annotations $(TAULIB)

MPIEXEC = mpiexec
NP = 5

MPISRC = sequential.cpp  tensormatrix_mpi.cpp perf.cpp utils.cpp \
	masterworker.cpp utils_parall.cpp 
#mw_addslave.cpp hierarchical.cpp  \
#         perf.cpp  sequential.cpp  tensormatrix_mpi.cpp      \
#        profiling.cpp mw_combined.cpp \
#	 masterworker2.cpp mw_addslave2.cpp hierarchical2.cpp  \
#	 masterworker3.cpp mw_addslave3.cpp mw_addslave4.cpp \
#	 mw_tree.cpp

MPIOBJ= $(MPISRC:.cpp=.o)


all: tensormatrix_mpi

tensormatrix_mpi: $(MPIOBJ)
	$(MPILD)  -o $@ $^ $(LDOPT)

tensormatrix: tensormatrix.o
	$(LD) -o $@ $^ $(LDOPT)

%.o: %.cpp
	$(MPICXX) $(CFLAGS) -o $@ -c $<

run: tensormatrix_mpi
	$(MPIEXEC) --oversubscribe -n $(NP) $<

clean:
	@rm -f *.o tensormatrix_mpi tensormatrix

.PHONY: clean run