#  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#    File:         Makefile                                                  */
#    Description:  Makefile for programs running a parallel k-means          */
#                  clustering algorithm                                      */
#                                                                            */
#    Author:  Wei-keng Liao                                                  */
#             EECS Department Northwestern University                        */
#             email: wkliao@eecs.northwestern.edu                            */
#                                                                            */
#    Copyright (C) 2013, Northwestern University                             */
#    See COPYRIGHT notice in top-level directory.                            */
#                                                                            */
#  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

.KEEP_STATE:

all: mpi_main

MPICC       = $(HOME)/OpenMPI/1.8/bin/mpicc
MPICC       = mpicc
PNETCDF_DIR = $(HOME)/PnetCDF
DATATYPE    =
DATATYPE    = "long long"
DATATYPE    = "short"
DATATYPE    = "double"
DATATYPE    = "float"

# data type float is the default
ifeq (x$(DATATYPE), x)
DATATYPE   = "float"
endif

M4          = m4
DFLAGS      = -DDATATYPE=$(DATATYPE)
INCFLAGS    = -I.
OPTFLAGS    = -g -Wall -ansi
OPTFLAGS    = -O -DNDEBUG
CFLAGS      = $(OPTFLAGS) $(DFLAGS) $(INCFLAGS)
LDFLAGS     = $(OPTFLAGS)

INCFLAGS   += -I$(PNETCDF_DIR)/include
LIBS       += -L$(PNETCDF_DIR)/lib -lpnetcdf

PNETCDF_HEADER = $(PNETCDF_DIR)/include/pnetcdf.h
PNETCDF_LIB    = $(PNETCDF_DIR)/lib/libpnetcdf.a

HEADER_SRCS  = kmeans.h
M4_SRCS      = pnetcdf_io.m4

MPI_SRCS     = mpi_main.c   \
               mpi_kmeans.c \
               util.c

MPI_OBJ      = $(MPI_SRCS:%.c=%.o) $(COMM_SRC:%.c=%.o) $(M4_SRCS:.m4=.o)

mpi_main.o: mpi_main.c $(HEADER_SRCS) $(PNETCDF_HEADER)
	$(MPICC) $(CFLAGS) -c $*.c

mpi_kmeans.o: mpi_kmeans.c $(HEADER_SRCS) $(PNETCDF_HEADER)
	$(MPICC) $(CFLAGS) -c $*.c

util.o: util.c $(HEADER_SRCS)
	$(MPICC) $(CFLAGS) -c $*.c

pnetcdf_io.c: pnetcdf_io.m4 $(HEADER_SRCS) Makefile
	$(M4) $(DFLAGS) pnetcdf_io.m4 >$@

pnetcdf_io.o: pnetcdf_io.c $(HEADER_SRCS) $(PNETCDF_HEADER)
	$(MPICC) $(CFLAGS) -c $*.c

mpi_main: $(MPI_OBJ) $(PNETCDF_LIB)
	$(MPICC) $(LDFLAGS) -o $@ $(MPI_OBJ) $(LIBS)

IMAGE_FILES =   color17695.nc \
                 edge17695.nc \
              texture17695.nc

INPUTS = $(IMAGE_FILES:%=Image_data/%)

PACKING_LIST = $(COMM_SRC) $(MPI_SRCS) $(HEADER_SRCS) $(M4_SRCS) \
               Makefile README COPYRIGHT sample.output

dist:
	dist_dir=parallel-kmeans-int64 \
	&& rm -rf $$dist_dir $$dist_dir.tar.gz\
	&& mkdir -p $$dist_dir/Image_data \
	&& cp $(PACKING_LIST) $$dist_dir \
	&& cp $(INPUTS) $$dist_dir/Image_data \
	&& tar -cf - $$dist_dir | gzip > $$dist_dir.tar.gz \
	&& rm -rf $$dist_dir

clean:
	rm -rf $(MPI_OBJ) pnetcdf_io.c mpi_main core* .make.state \
		Image_data/color17695.kmeans_out.nc \
		Image_data/edge17695.kmeans_out.nc \
		Image_data/texture17695.kmeans_out.nc

check: all
	mpiexec -n 4 mpi_main -i Image_data/color17695.nc -v color17695 -c Image_data/color17695.nc -k color17695 -n 4 -o out.nc


