# 4 versions of diffusion 1d simulation:
# 1. diffusion1d_spec : plain sequential
# 2. diffusion1d_par : standard parallel algorithm using blocking comm.
# 3. diffusion1d_nb : using nonblocking communication
# 4. diffusion1d_jitter : jitter-resistant algorithm
#
# 2 versions of diffusion 2d simulation
# 1. diffusion2d_nb : using nonblocking communication
# 2. diffusion2d_jitter : jitter-resistant algorithm

MPICC = mpicc

# For MPE on chimera add: -lpmi -mpe=log
ILIBS = timerInterrupter.o interrupter_utils.o rantools.o -lm
2DPARLIBS = diffusion2d_util.o diffusion2d_common.o benchmark_timer.o $(ILIBS)
I2DPARLIBS = diffusion2d_util.o idiffusion2d_common.o benchmark_timer.o $(ILIBS) 
1DPARLIBS = diffusion1d_util.o diffusion1d_mpi.o benchmark_timer.o $(ILIBS)
1DSEQLIBS = diffusion1d_util.o benchmark_timer.o $(ILIBS)

FLAGS = -DP0_UNI -DPI_GAUS #-DP0_OFFSET -DPI_CNST #-DDEBUG 
ISWITCH = -DNOINTERRUPTS

MAKES = Makefile


########################## Compile Utiliities ########################## 
## Shared
rantools.o: iutils/rantools.h iutils/rantools.c $(MAKES)
	cc $(FLAGS) -c iutils/rantools.c

interrupter_utils.o: iutils/interrupter_utils.h iutils/interrupter_utils.c $(MAKES)
	cc $(FLAGS) -c iutils/interrupter_utils.c

timerInterrupter.o: iutils/timerInterrupter.c iutils/interrupter.h $(MAKES)
	$(MPICC) $(FLAGS) -c iutils/timerInterrupter.c

benchmark_timer.o: benchmark_timer.h benchmark_timer.c $(MAKES)
	cc $(FLAGS) -c benchmark_timer.c

## 2D
diffusion2d_util.o: diffusion2d_util.h diffusion2d_util.c $(MAKES)
	cc $(FLAGS) -c diffusion2d_util.c

diffusion2d_common.o: diffusion2d_util.h diffusion2d_common.h\
	diffusion2d_common.c $(MAKES)
	$(MPICC) $(FLAGS) -c diffusion2d_common.c

idiffusion2d_common.o: diffusion2d_util.h diffusion2d_common.h\
	diffusion2d_common.c $(MAKES)
	$(MPICC) $(FLAGS) $(ISWITCH) -c diffusion2d_common.c -o idiffusion2d_common.o

## 1D 
diffusion1d_util.o: diffusion1d_util.h diffusion1d_util.c $(MAKES)
	cc $(FLAGS) -c diffusion1d_util.c

diffusion1d_mpi.o: diffusion1d_util.h diffusion1d_mpi.h diffusion1d_mpi.c $(MAKES)
	$(MPICC) $(FLAGS) -c diffusion1d_mpi.c

## Test
interrupttest: timerInterrupter.o interrupttest.c $(MAKES)
	$(MPICC) $(FLAGS) -o interrupttest interrupttest.c timerInterrupter.o

## Depricated
signalInterrupter.o: iutils/interrupter.h iutils/signalInterrupter.c $(MAKES)
	cc $(FLAGS) -c signalInterrupter.c

######################## Compile Simulation Code  #####################
## 1D
1dnb: diffusion1d_nb.c $(1DPARLIBS) $(MAKES)
	$(MPICC) -o nb1d $(FLAGS) diffusion1d_nb.c $(1DPARLIBS)

1dpar: diffusion1d_par.c $(1DPARLIBS) $(MAKES)
	$(MPICC) -o par1d $(FLAGS) diffusion1d_par.c $(1DPARLIBS)

1djit: diffusion1d_jitter.c $(1DPARLIBS) $(MAKES)
	$(MPICC) -o jit1d $(FLAGS) diffusion1d_jitter.c $(1DPARLIBS)

1djit2: diffusion1d_jitter2.c $(1DPARLIBS) $(MAKES)
	$(MPICC) -o jit21d $(FLAGS) diffusion1d_jitter2.c $(1DPARLIBS)

1dseq: diffusion1d_seq.c  $(1DSEQLIBS) $(MAKES)
	$(MPICC) -o seq1d  $(FLAGS) diffusion1d_seq.c $(1DSEQLIBS) 

all-1d: 1dnb 1dpar 1djit 1djit2 1dseq

## 2D
2dnb: diffusion2d_nb.c $(2DPARLIBS) $(MAKES)
	$(MPICC) -o nb2d $(FLAGS) diffusion2d_nb.c $(2DPARLIBS)

2djit: diffusion2d_jitter.c $(2DPARLIBS) $(MAKES)
	$(MPICC) -o jit2d $(FLAGS) diffusion2d_jitter.c $(2DPARLIBS)

2dnbni: diffusion2d_nb.c $(I2DPARLIBS) $(MAKES)
	$(MPICC) -o nb2dni $(FLAGS) $(ISWITCH) diffusion2d_nb.c $(I2DPARLIBS)

2djitni: diffusion2d_jitter.c $(I2DPARLIBS) $(MAKES)
	$(MPICC) -o jit2dni $(FLAGS) $(ISWITCH) diffusion2d_jitter.c $(I2DPARLIBS)

all-2d: 2dnb 2djit 2dnbni 2djitni

############################ Clean-Up ############################
clean-2d:
	rm -f nb2d jit2d nb2dni jit2dni *.o *~

clean-1d: 
	rm nb1d par1d jit1d jit21d seq1d

clean-ilib: 
	rm iutils/*.o iutils/*~

clean-2dout:
	rm -f output/profile/*.dat output/*.csv* *~ *.o 
cleanup:
	rm *~ *.o

clean-all: clean-1d clean-2d clean-ilib
	 rm *~ *.o


############################ Setup Experiments ############################
SUBMISSION_CMD="runjob -n 32768 -p 16 --block $COBALT_PARTNAME --stdinrank 0 : "

paper: all-2d build-exp run-exp

build-exp:
	export SUBMISSION_CMD="runjob -n 32768 -p 16 --block $COBALT_PARTNAME --stdinrank 0 : "
	gcc -std=c99 input/paper-experiments/experiment_gen.c \
		-o input/paper-experiments/a.out
	./input/paper-experiments/a.out 
	mv *.txt input/paper-experiments/
run-exp:
	chmod +x experiments.sh
	qsub -A THModeling -n 32768 -t 500 --mode script experiments.sh

clean-exp: clean-2d
	rm -f input/paper-experiments/*.txt input/paper-experiments/a.out experiments.sh
	#unset SUBMISSION_CMD
