SHELL := bash

BIN=./bin

ifeq ($(origin CC),default)
  CC = gcc
endif

ifeq ($(CC),ifort)
  MPICC = mpiicc
endif

MPICC ?= mpicc

$(shell  mkdir -p $(BIN))

CFLAGS_BASE = -O3
CFLAGS_gcc   = -march=native -Wall
CFLAGS_icc   = -march=core-avx2 -warn

MPICFLAGS_mpicc = $(CFLAGS_gcc)
MPICFLAGS_mpiicc = $(CFLAGS_icc)

CFLAGS += $(CFLAGS_BASE) $(CFLAGS_$(CC))
MPICFLAGS += $(CFLAGS_BASE) $(MPICFLAGS_$(MPICC))

LDFLAGS = -lm

all: diffusion_serial.x diffusion_mpi.x

diffusion_serial.x: %.x : %.c
	$(CC) $(CFLAGS) -o $(BIN)/$@ $^ $(LDFLAGS)

diffusion_mpi.x: %.x : %.c
	$(MPICC) $(MPICFLAGS) -o $(BIN)/$@ $^ $(LDFLAGS)

diffusion_oddeven.x: %.x : %.c
	$(MPICC) $(MPICFLAGS) -o $(BIN)/$@ $^ $(LDFLAGS)

diffusion_sendrecv.x: %.x : %.c
	$(MPICC) $(MPICFLAGS) -o $(BIN)/$@ $^ $(LDFLAGS)

run_serial: diffusion_serial.x
	$(BIN)/diffusion_serial.x

run_mpi: diffusion_mpi.x
	mpirun -np 4 $(BIN)/diffusion_mpi.x

run_oddeven: diffusion_oddeven.x
	mpirun -np 4 $(BIN)/diffusion_oddeven.x

run_sendrecv: diffusion_sendrecv.x
	mpirun -np 4 $(BIN)/diffusion_sendrecv.x

plot: diffusion.gnuplt diffusion.param.gnuplt diffusion.dat
	gnuplot diffusion.gnuplt

clean: 
	rm -rf $(BIN) diffusion.param.gnuplt diffusion.dat diffusion.gif