# $Id: Makefile 857 2006-06-22 15:57:33Z olau $

MPIEXEC=mpiexec
MPIROOT=/opt/mpich2

#######################################################
# Einstellungen fr den GCC
#######################################################
CC=/opt/gcc-4.2-20060527/bin/gcc
F90=/opt/gcc-4.2-20060527/bin/gfortran
#DEBUGFLAGS=-DDEBUG -ggdb
OPTIMIZE=-O3 -msse2
OMPFLAGS=-fopenmp -lgomp
CFLAGS=$(DEBUGFLAGS) $(OPTIMIZE) -Wall
LFLAGS=-lm
OUT=-o
O=.o

#######################################################
# Einstellungen fr den Intel-Compiler
#######################################################
#CC=/opt/intel/cc/9.1.038/bin/icc
#DEBUGFLAGS=-DDEBUG
#OMPFLAGS=-openmp
#OPTIMIZE=-O3 -ipo -msse2
#CFLAGS=$(OPTIMIZE) -Wall
#LFLAGS=-lm
#OUT=-o
#O=.o


release:
	$(MAKE) all O="$(O)" \
		CFLAGS="$(CFLAGS)" \
		CXXFLAGS="$(CXXFLAGS)" \
		LFLAGS="$(LFLAGS)" \
		OUT="$(OUT)"

debug:
	$(MAKE) all O="$(O)" \
		CFLAGS="$(CFLAGS) $(DEBUGFLAGS)" \
		CXXFLAGS="$(CXXFLAGS)" \
		LFLAGS="$(LFLAGS)" \
		OUT="$(OUT)"


all: pi pi-bbp pi-bbp-openmp pi-bbp-openmp2 pi-bbp-openmp3 pi-openmp pi-pthreads pi-mpi openmp-timer openmp0 openmp1 openmp2 openmp3 iso/iso

clean:
	$(RM) *.o
	$(RM) pi
	$(RM) pi-bbp
	$(RM) pi-bbp-openmp
	$(RM) pi-bbp-openmp2
	$(RM) pi-bbp-openmp3
	$(RM) pi-openmp
	$(RM) pi-mpi
	$(RM) pi-pthreads
	$(RM) libtimer.a
	$(RM) openmp-timer
	$(RM) openmp0
	$(RM) openmp1
	$(RM) openmp2
	$(RM) openmp3
	$(RM) iso/iso

openmp-timer: openmp-timer.c ompdefs.h Makefile timer
	$(CC) $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -L. $(OUT) openmp-timer openmp-timer.c libtimer.a

openmp0: openmp0.c ompdefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -L. $(OUT) openmp0 openmp0.c

openmp1: openmp1.c ompdefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -L. $(OUT) openmp1 openmp1.c

openmp2: openmp2.c ompdefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -L. $(OUT) openmp2 openmp2.c

openmp3: openmp3.c ompdefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -L. $(OUT) openmp3 openmp3.c

pi: timer pi.c globaldefs.h Makefile
	$(CC) $(CFLAGS) $(LFLAGS) -L. -ltimer $(OUT) pi pi.c

pi-bbp: timer pi-bbp.c globaldefs.h Makefile
	$(CC) $(CFLAGS) $(LFLAGS) -L. -ltimer $(OUT) pi-bbp pi-bbp.c

pi-bbp-openmp: timer pi-bbp-openmp.c ompdefs.h globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) -L. -ltimer -L$(COMPROOT)/lib $(LFLAGS) $(OUT) pi-bbp-openmp pi-bbp-openmp.c

pi-bbp-openmp2: timer pi-bbp-openmp2.c ompdefs.h globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) -L. -ltimer -L$(COMPROOT)/lib $(LFLAGS) $(OUT) pi-bbp-openmp2 pi-bbp-openmp2.c

pi-bbp-openmp3: timer pi-bbp-openmp3.c ompdefs.h globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) -L. -ltimer -L$(COMPROOT)/lib $(LFLAGS) $(OUT) pi-bbp-openmp3 pi-bbp-openmp3.c

pi-openmp: timer pi-openmp.c ompdefs.h globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OMPFLAGS) -L. -ltimer -L$(COMPROOT)/lib $(LFLAGS) $(OUT) pi-openmp pi-openmp.c

iso/iso: iso/iso.c ompdefs.h Makefile
	$(CC) -DUSE_GD $(CFLAGS) $(OMPFLAGS) $(LFLAGS) -lgd -L. $(OUT) iso/iso iso/iso.c

pi-mpi: timer pi-mpi.c globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OUT) pi-mpi pi-mpi.c $(LFLAGS) -lmpich -L. -ltimer -L$(MPIROOT)/lib -I$(MPIROOT)/include  

pi-pthreads: timer pi-pthreads.c globaldefs.h Makefile
	$(CC) $(CFLAGS) $(OUT) pi-pthreads pi-pthreads.c $(LFLAGS) -lpthread -L. -ltimer

timer: libtimer.a

libtimer.a: timer/timer.c timer/timer.h Makefile
	$(CC) $(CFLAGS) $(OUT) libtimer.a -c timer/timer.c

test-scalar: pi
	./pi

# before executing "make test", make sure that
# environment variable LD_LIBRARY_PATH contains
# the path to the GOMP library
test-openmp: pi-openmp
	export OMP_NUM_THREADS=1;  ./pi-openmp
	export OMP_NUM_THREADS=2;  ./pi-openmp
	export OMP_NUM_THREADS=4;  ./pi-openmp
	export OMP_NUM_THREADS=8;  ./pi-openmp
	export OMP_NUM_THREADS=16; ./pi-openmp

test-mpi: pi-mpi
	$(MPIEXEC) -n  1 ./pi-mpi
	$(MPIEXEC) -n  2 ./pi-mpi
	$(MPIEXEC) -n  4 ./pi-mpi
	$(MPIEXEC) -n  8 ./pi-mpi
	$(MPIEXEC) -n 16 ./pi-mpi

test-pthreads: pi-pthreads
	./pi-pthreads -n  1
	./pi-pthreads -n  2
	./pi-pthreads -n  3
	./pi-pthreads -n  4
	./pi-pthreads -n  8
	./pi-pthreads -n 16

test-wthreads:
	./pi-wthreads -m 10000000
	./pi-wthreads -m 10001000
	./pi-wthreads -m 10101010
	./pi-wthreads -m 01010101
	./pi-wthreads -m 11111111

test-simple:
	./openmp0
	./openmp1
	./openmp2
	./openmp-timer
	export OMP_NUM_THREADS=1; ./openmp3
	export OMP_NUM_THREADS=2; ./openmp3
	export OMP_NUM_THREADS=4; ./openmp3
	export OMP_NUM_THREADS=8; ./openmp3

tests: test-dummy test-scalar test-openmp test-pthreads test-mpi
