CXX = icpx

FLAGS =
FLAGS_S =

ifeq ($(CXX), g++)
	FLAGS = -std=c++0x -Wall -Winline -Wshadow -W -O3 -fopenmp -march=native
	FLAGS_S = -std=c++0x -Wall -Winline -Wshadow -W -O3 -fopenmp-stubs -march=native
else
	FLAGS = -std=c++0x -Wall -Winline -Wshadow -W -O3 -qopenmp -xHOST
	FLAGS_S = -std=c++0x -Wall -Winline -Wshadow -W -O3 -qopenmp-stubs -xHOST -pg
endif

INCLUDES =-Iinclude
LDFLAGS =
LIBS =

#EXTRA_FLAGS :=
CXXFLAGS = $(FLAGS) $(EXTRA_FLAGS)
CXXFLAGS_S = $(FLAGS_S) $(EXTRA_FLAGS)

all: perf perf-serial

perf: perf.o Grid.o PDE.o Solver.o timer.o
	$(CXX) $(CXXFLAGS) Grid.o PDE.o Solver.o perf.o timer.o $(LDFLAGS) -o $@ $(LIBS)

perf-serial: perf_s.o Grid_s.o PDE_s.o Solver_s.o timer_s.o
	$(CXX) $(CXXFLAGS_S) perf_s.o Grid_s.o PDE_s.o Solver_s.o timer_s.o $(LDFLAGS) -o $@ $(LIBS)

perf.o: src/perf.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) src/perf.cpp

Solver.o: src/Solver.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) src/Solver.cpp

PDE.o: src/PDE.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) src/PDE.cpp

Grid.o: src/Grid.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) src/Grid.cpp

timer.o: src/timer.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) src/timer.cpp
	
perf_s.o: src/perf.cpp
	$(CXX) -c $(CXXFLAGS_S) $(INCLUDES) src/perf.cpp -o $@

Solver_s.o: src/Solver.cpp
	$(CXX) -c $(CXXFLAGS_S) $(INCLUDES) src/Solver.cpp -o $@

PDE_s.o: src/PDE.cpp
	$(CXX) -c $(CXXFLAGS_S) $(INCLUDES) src/PDE.cpp -o $@

Grid_s.o: src/Grid.cpp
	$(CXX) -c $(CXXFLAGS_S) $(INCLUDES) src/Grid.cpp -o $@

timer_s.o: src/timer.cpp
	$(CXX) -c $(CXXFLAGS_S) $(INCLUDES) src/timer.cpp -o $@

.PHONY: clean
clean:
	@$(RM) -rf *.o perf perf-serial
