CC=gcc
FC=gfortran
FFLAGS=-O3 -mavx -march=ivybridge -mtune=ivybridge 
CFLAGS=-O3 -mavx -march=ivybridge -mtune=ivybridge 

MPIFC=mpif90
MPICC=mpicc

ATLASLOC=$(ATLASROOT)/lib
MKLLOC=$(MKLROOT)/lib/intel64
OBLASLOC=$(BLASROOT)/lib
LAPACKLOC=/apps/libraries/lapack/3.6.0/gnu/lib
SCALAPACKLOC=$(SCALAPACKROOT)
SMMLOC=$(LIBSMMROOT)/lib
FINALLIBSINTEL=-lifcore -lgfortran -lpthread -lm
FINALLIBS=-lgfortran -lpthread -lrt -lm


default :  \
	   dgemm_code.x \
	   dgemm_matmul.x \
	   dgemm_lapack.x \
	   dgemm_openblas.x \
           dgemm_openblasp.x \
           dgemm_atlas.x \
           dgemm_atlasp.x \
           dgemm_small_lapack.x \
           dgemm_small_atlas.x \
           dgemm_small_openblas.x \
	   dgesv_lapack.x \
	   dgesv_openblas.x \
           dgesv_openblasp.x \
           dgesv_atlas.x \
           dgesv_atlasp.x  \
	   dgesv_scalapack_oblas.x


.c.o:
	$(CC) -c $(CFLAGS) $<

.f.o:
	$(FC) -c $(FFLAGS) $<

dgemm_small_lapack.x : rand.o dgemm_small.o dgemm_smm_compare.o csecond.o
	$(CC) $(CFLAGS) dgemm_smm_compare.o rand.o csecond.o dgemm_small.o  \
	-L${LAPACKLOC} -llapack -lrefblas \
        -L$(SMMLOC) -lsmm_dnn \
	-o dgemm_small_lapack.x $(FINALLIBS)

dgemm_small_atlas.x : rand.o dgemm_small.o dgemm_smm_compare.o csecond.o
	$(CC) $(CFLAGS) dgemm_smm_compare.o rand.o csecond.o dgemm_small.o  \
	-L${ATLASLOC} -llapack -lf77blas -lcblas -latlas \
        -L$(SMMLOC) -lsmm_dnn \
	-o dgemm_small_atlas.x $(FINALLIBS)

dgemm_small_mkl.x : rand.o dgemm_small.o dgemm_smm_compare.o csecond.o
	$(CC) $(CFLAGS) -mkl=sequential dgemm_smm_compare.o rand.o csecond.o dgemm_small.o  \
	-L${MKLLOC} -lmkl_intel_lp64  -lmkl_lapack95_lp64 -lmkl_core  \
        -L$(SMMLOC) -lsmm_dnn \
	-o dgemm_small_mkl.x $(FINALLIBS)

dgemm_small_openblas.x : rand.o dgemm_small.o dgemm_smm_compare.o csecond.o
	$(CC) $(CFLAGS) dgemm_smm_compare.o rand.o csecond.o dgemm_small.o  \
	-L${OBLASLOC} -lopenblas  \
        -L$(SMMLOC) -lsmm_dnn \
	-o dgemm_small_openblas.x $(FINALLIBS)

dgesv_lapack.x : rand.o dgesv_master.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -c solvesystemLU.f 
	$(CC) $(CFLAGS) solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_master.o  \
	-L${LAPACKLOC} -llapack -lrefblas \
	-o dgesv_lapack.x $(FINALLIBS)

dgesv_openblas.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -c solvesystemLU.f 
	$(CC) $(CFLAGS) solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${OBLASLOC} -lopenblas  \
	-o dgesv_openblas.x $(FINALLIBS)

dgesv_openblasp.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -c solvesystemLU.f 
	$(CC) $(CFLAGS) solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${OBLASLOC} -lopenblasp  \
	-o dgesv_openblasp.x $(FINALLIBS)

dgesv_atlas.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -c solvesystemLU.f 
	$(CC) $(CFLAGS) solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${ATLASLOC} -llapack -lf77blas -lcblas -latlas \
	-o dgesv_atlas.x $(FINALLIBS)

dgesv_atlasp.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -c solvesystemLU.f 
	$(CC) $(CFLAGS) -fopenmp solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${ATLASLOC} -llapack -lptf77blas -lptcblas -latlas \
	-o dgesv_atlasp.x $(FINALLIBS)

dgesv_mkl.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -mkl=sequential -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -mkl=sequential -c solvesystemLU.f 
	$(CC) $(CFLAGS) -mkl=sequential solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${MKLLOC} -lmkl_intel_lp64  -lmkl_lapack95_lp64 -lmkl_core  \
	-o dgesv_mkl.x $(FINALLIBSINTEL)

dgesv_mklp.x : rand.o dgesv_single.o solvesystemDGESV.o csecond.o solvesystemLU.o
	$(FC) $(FFLAGS) -mkl=parallel -c solvesystemDGESV.f 
	$(FC) $(FFLAGS) -mkl=parallel -c solvesystemLU.f 
	$(CC) $(CFLAGS) -mkl=parallel solvesystemDGESV.o solvesystemLU.o rand.o csecond.o dgesv_single.o  \
	-L${MKLLOC} -lmkl_intel_lp64  -lmkl_lapack95_lp64 -lmkl_core \
	-o dgesv_mklp.x $(FINALLIBSINTEL)

dgemm_lapack.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${LAPACKLOC} -llapack -lrefblas \
	-o dgemm_lapack.x $(FINALLIBS)

dgemm_code.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULCODE -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${LAPACKLOC} -llapack -lrefblas \
	-o dgemm_code.x $(FINALLIBS)

dgemm_matmul.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULMATMUL -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${LAPACKLOC} -llapack -lrefblas \
	-o dgemm_matmul.x $(FINALLIBS)

dgemm_openblas.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${OBLASLOC} -lopenblas \
	-o dgemm_openblas.x $(FINALLIBS)

dgemm_openblasp.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${OBLASLOC} -lopenblasp \
	 -o dgemm_openblasp.x $(FINALLIBS)

dgemm_atlas.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${ATLASLOC} -llapack -lf77blas -lcblas -latlas \
	-o dgemm_atlas.x $(FINALLIBS)

dgemm_atlasp.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) -fopenmp dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${ATLASLOC} -llapack -lptf77blas -lptcblas -latlas \
	 -o dgemm_atlasp.x $(FINALLIBS)

dgemm_mkl.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -mkl=sequential -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) -mkl=sequential  dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${MKLLOC} -lmkl_intel_lp64  -lmkl_lapack95_lp64 -lmkl_core  \
	-o dgemm_mkl.x $(FINALLIBSINTEL)

dgemm_mklp.x : rand.o dgemm_master.o dgemm_compare.o csecond.o
	$(FC) $(FFLAGS) -mkl=parallel -c dgemm_compare.f 
	$(CC) $(CFLAGS) -DMATMULDGEMM -c dgemm_master.c 
	$(CC) $(CFLAGS) -mkl=parallel  dgemm_compare.o rand.o csecond.o dgemm_master.o  \
	-L${MKLLOC} -lmkl_intel_lp64  -lmkl_lapack95_lp64 -lmkl_core \
	 -o dgemm_mklp.x -lgfortran -lpthread


solvesystemMPI.o: solvesystemMPI.f
	$(MPIFC) $(FFLAGS)  -c $<

solvesystemMPI.$(SIZE).o: solvesystemMPI.$(SIZE).f
	$(MPIFC) $(FFLAGS) -c $<

dgesv_scalapack_mkl.$(SIZE).x : rand.o solvesystemMPI.$(SIZE).o csecond.o scalapackinfo.o
	$(MPIFC) $(FFLAGS) -mkl=sequential solvesystemMPI.$(SIZE).o scalapackinfo.o rand.o csecond.o \
	-L${MKLLOC}  -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64 -lmkl_lapack95_lp64 -lmkl_blas95_lp64 -lmkl_intel_lp64  -lmkl_core  \
	-o dgesv_scalapack_mkl.$(SIZE).x -lgfortran
	rm -f solvesystemMPI.$(SIZE).o solvesystemMPI.$(SIZE).f

dgesv_scalapack_oblas.x : rand.o solvesystemMPI.o csecond.o scalapackinfo.o
	$(MPIFC) $(FFLAGS) solvesystemMPI.o scalapackinfo.o rand.o csecond.o \
	-L$(SCALAPACKLOC) -lscalapack \
	-L${OBLASLOC} -lopenblas  \
	-o dgesv_scalapack_oblas.x 
	rm -f solvesystemMPI.o 




clean: 
	rm -f *.o *.x
