# **********************************************************
#  MAKEFILE OF THE KNIT PROJECT                            *
#  IN PRINCIPLE YOU SHOULD ONLY NEED TO MAKE CHANGES IN    *
#  PART 1. AND 2.                                          *
# **********************************************************


# **********************************************************
#  1. MACHINE SPECIFIC PART:                               *
#  ADD LIES CORRESPONDING TO YOUR MACHINE HERE             *
# **********************************************************

# define HOST variable in order not to use all the time $$HOSTNAME
HOST = $(shell echo $$HOSTNAME)

ifeq ($(strip $(HOST)),)
$(error HOSTNAME is not defined !)
endif

# DIRECTIVES FOR DRECAM047027 Pentium IV 2 GHz
ifeq ($(strip $(HOST)),drecam47027)
CC= g++
PYTHDR=/usr/include/python2.4/
BLZHDR=/usr/local/stow/Blitz-0.9/include
#MYBLAS=/usr/local/atlas/lib/
#LFLAGS = -L$(HOME) --export-dynamic  -llapack -L$(MYBLAS) -lf77blas -lg2c -lpython2.3
MYBLAS=/opt/intel/mkl/10.0.1.014/lib/32/
LFLAGS = -L$(HOME) --export-dynamic  -L$(MYBLAS) -lmkl -lmkl_lapack -lmkl_intel_thread -lguide -lg2c -lpython2.4
# Important: export LD_LIBRARY_PATH=/opt/intel/mkl/10.0.1.014/lib/32:$LD_LIBRARY_PATH
endif 

# DIRECTIVES FOR XAVIER LAPTOP Core 2 duo 2.0 GHz 2GoRAM
ifeq ($(strip $(HOST)),waintal-laptop)
CC= g++
#CC=icpc
PYTHDR=/usr/include/python2.5
BLZHDR=/usr/local/include/blitz
BLZLIB=/usr/local/lib/
BLASLIB=/opt/intel/mkl/10.0.1.014/lib/em64t
# Attention: export LD_LIBRARY_PATH=/opt/intel/mkl/10.0.1.014/lib/em64t:$LD_LIBRARY_PATH
LFLAGS_ICC = -L$(HOME) -cxxlib-gcc   -L$(BLASLIB) -lmkl -lmkl_lapack -lguide   -lgfortran -lpython2.5 -L$(BLZLIB) -lblitz -lpthread
LFLAGS_GCC = -L$(HOME) --export-dynamic -L$(BLASLIB) -lmkl -lmkl_lapack -lguide  -lg2c  -lpython2.5 -L$(BLZLIB) -lblitz -lpthread
LFLAGS=$(LFLAGS_GCC)
#LFLAGS = -L$(HOME) --export-dynamic  -L$(BLASLIB) -lmkl -lmkl_lapack -lguide  -lg2c -lpython2.5 -L$(BLZLIB) -lblitz
endif

# DIRECTIVES FOR SPEC CLUSTER CYBELLE (XEONS)
ifeq ($(strip $(HOST)),cybelle.extra.cea.fr)
CC= g++
PYTHDR=/usr/include/python2.4
BLZHDR=/share/apps/blitz/include
BLZLIB=/share/apps/blitz/lib
MKLLIB=/share/apps/intel/mkl/10.1.1.019/lib/em64t/
LFLAGS = -L$(HOME)  -L$(MKLLIB) -Wl,--start-group $(MKLLIB)libmkl_intel_lp64.a $(MKLLIB)libmkl_intel_thread.a $(MKLLIB)libmkl_core.a -liomp5 -lpthread -lgfortran -lpython2.4 -L$(BLZLIB) -Wl,--end-group -lblitz --export-dynamic
# FOR SOME OBSCURE REASONS, ONLY STATIC LINKING WORKED HERE WITH MKL.
# OTHER PEOPLE HAD THE SAME PROBLEM WHEN USING DYNAMIC LIBRARY WITH
# PYTHON AND MKL......
endif

# DIRECTIVES FOR MACBOOK at CEA
ifeq ($(strip $(HOST)),drecam0063.saclay.cea.fr)
CC= g++
PYTHDR=/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 # Numeric package must be installed here. Python.h is here; Numeric/arrayobject.h is here
BLZHDR=/opt/local/var/macports/software/blitz/0.9_0/opt/local/include      # blitz/array.h  is here
BLZLIB=/opt/local/var/macports/software/blitz/0.9_0/opt/local/lib          # libblitz.dylib is here.

# Use -lgfortran instead of obsolete -lg2c
LFLAGS = -L$(HOME)  --export-dynamic  -framework Accelerate -llapack -lblas  -lgfortran -lpython2.5   -L$(BLZLIB) -lblitz -dynamiclib -flat_namespace    
endif

# DIRECTIVES FOR HAVARDS COMPUTER IN TRONDHEIM
ifeq ($(strip $(HOST)),pascal.phys.ntnu.no)
CC= g++
PYTHDR=/usr/include/python2.5
BLZHDR=/usr/local/stow/Blitz-0.9/include
BLZLIB=/usr/local/stow/Blitz-0.9/lib
# Use -lgfortran instead of obsolete -lg2c
LFLAGS = -L$(HOME) --export-dynamic  -llapack -lgfortran -lpython2.5 -L$(BLZLIB) -lblitz
endif

# DIRECTIVES FOR ARTELYYSE
ifeq ($(strip $(HOST)),ARTELYSSE)
CC= g++
PYTHDR=/usr/include/python2.4
BLZHDR=/usr/local/include/blitz
BLZLIB=/usr/local/lib
# Use -lgfortran instead of obsolete -lg2c
LFLAGS = -L$(HOME) --export-dynamic  -llapack -lgfortran -lpython2.4 -L$(BLZLIB) -lblitz
endif



# DIRECTIVES FOR AYMEN COMPUTER 
ifeq ($(strip $(HOST)),abenhami-desktop)
CC=/usr/bin/g++-4.2
PYTHDR=/usr/include/python2.5
BLZHDR=/usr/local/include/blitz
BLZLIB=/usr/local/lib
MKLLIB=/opt/intel/mkl/10.1.1.019/lib/32/

# Attention: export LD_LIBRARY_PATH=/opt/intel/mkl/10.1.1.019/lib/em64t:$LD_LIBRARY_PATH
LFLAGS = -L$(HOME)   -Wl,--start-group $(MKLLIB)libmkl_intel.a $(MKLLIB)libmkl_sequential.a $(MKLLIB)libmkl_core.a   -lpthread -lgfortran  -lpython2.5 -L$(BLZLIB) -Wl,--end-group -lblitz --export-dynamic

#LFLAGS_GCC = -L$(HOME) --export-dynamic -L$(BLASLIB) -lmkl -lmkl_lapack -lguide  -lg2c  -lpython2.5 -L$(BLZLIB) -lblitz -lpthread
#LFLAGS=$(LFLAGS_GCC)
# Use -lgfortran instead of obsolete -lg2c
#LFLAGS = -L$(HOME) --export-dynamic  -llapack -lgfortran -lpython2.5 -L$(BLZLIB) -lblitz
endif



# DIRECTIVES FOR MOUSSAILLON opteron 64: 2.4 GHz 4 proc 4Go RAM
ifeq ($(strip $(HOST)),moussaillon)
CC= g++
PYTHDR=/usr/include/python2.3
BLZHDR=/usr/local/stow/Blitz-0.9/include
BLZLIB=/usr/local/stow/Blitz-0.9/lib
LFLAGS = -L$(HOME) --export-dynamic  -llapack -lg2c -lpython2.3 -L$(BLZLIB) -lblitz
#MYBLAS=/opt/intel/mkl/10.0.1.014/lib/em64t
#LFLAGS = -L$(HOME) --export-dynamic -L$(MYBLAS) -lmkl -lmkl_lapack -lmkl_intel_thread -lguide -lgfortran -lpython2.3 -L$(BLZLIB) -lblitz
# Important: export LD_LIBRARY_PATH=/opt/intel/mkl/10.0.1.014/lib/64:$LD_LIBRARY_PATH
#MYBLAS=/opt/acml4.0.1/gfortran64/lib
#LFLAGS = -L$(HOME) --export-dynamic  -L$(MYBLAS) -lacml /usr/lib64/libgfortran.so.1  -lpython2.3 -L$(BLZLIB) -lblitz
# Important: export LD_LIBRARY_PATH=/opt/acml4.0.1/gfortran64_mp/lib:$LD_LIBRARY_PATH
endif

# DIRECTIVES FOR ATHENIA: 2.4 GHz 2 proc 2Go RAM
ifeq ($(strip $(HOST)),athenia)
CC= g++
PYTHDR=/usr/include/python2.3/
BLZHDR=/usr/local/stow/Blitz-0.9/include
LFLAGS = -L$(HOME) --export-dynamic  -llapack -lg2c -lpython2.3 -L/usr/local/stow/Blitz_g++/lib  -lblitz 
endif

# DIRECTIVES FOR HERMIONE:?? 2.4 GHz 2 proc 2Go RAM
ifeq ($(strip $(HOST)),hermione)
CC= g++
PYTHDR=/usr/include/python2.3/
BLZHDR=/usr/local/stow/Blitz-0.9/include
LFLAGS = -L$(HOME) --export-dynamic  -llapack -lg2c -lpython2.3 -lblitz
endif


# **********************************************************
#  2. CHOOSE YOUR OPTIONS HERE                             *
# **********************************************************

CFLAGS = -I$(PYTHDR) -I$(BLZHDR) -I$(CURDIR) -I$(CURDIR)/kernel -I$(CURDIR)/lib
#CFLAGS +=  -O2 -fPIC  -pg
CFLAGS +=  -O2 -fPIC
#CFLAGS +=  -O3 -fPIC -finline-functions
#CFLAGS +=  -g -fno-inline -fno-default-inline -fPIC 
#CFLAGS += -D_DEBUG_DI_ -D_DEBUG_LONG_ -DUSE_BLITZ  -O2 -fPIC
CFLAGS += -D_DEBUG_
#CFLAGS +=  -pg

# ***********************************************************
#  3. DEFINITIONS OF THE OBJECTS TO BE COMPILED             *
# ***********************************************************

ALL_DIR_TO_SAVE = kernel/ lib/ interface/ info/ examples/ examplespy/ libpy/ 
FILE = knit
HEADERS :=  $(wildcard kernel/$(FILE)_*.h) # := permits to modify variable ones again
SOURCES :=  $(wildcard kernel/$(FILE)_*.C) #$(wildcard interface/*.C)
SOURCES_SWIG := interface/swig_knit.i
SOURCES_WRAP := $(patsubst %.i,%_wrap.cxx,$(SOURCES_SWIG))
OBJECTS_WRAP :=$(patsubst %.i,%_wrap.o,$(SOURCES_SWIG))
OBJECTS :=  $(SOURCES:.C=.o) # .C replace by .o
Makefile := Makefile $(FILE)_Makefile

TOTAL= $(HEADERS) $(SOURCES)


# ***********************************************************
#  4. DEFINITIONS OF THE TARGETS                            *
# ***********************************************************

all: python

# not real targets but just commands
.PHONY: clean tar depend image exe doc

$(OBJECTS): %.o:%.C 
	$(CC) $(CFLAGS) -c $< -o $@ 

$(OBJECTS_WRAP): %.o:%.cxx 
	$(CC) $(CFLAGS) -c $< -o $@ 

$(SOURCES_WRAP): %_wrap.cxx:%.i
	swig -c++ -python  -I$(BLZHDR) -o $@ $< 
#	swig -c++ -python  -I/usr/local/stow/Blitz_g++/include -o $@ $< 

$(FILE).out:  $(Makefile) $(OBJECTS) 
#executes main where main is defined 
	@$(CC) $(CFLAGS) -D_WITHMAIN_ -c kernel/$(FILE)_main.C -o kernel/$(FILE)_main.o 
	@$(CC)  -o $(FILE).out $(OBJECTS) $(LFLAGS)

clean:
	find . -regex '.*\(\.o\|\.out\|\.pyc\|_wrap\.cxx\|\#.*\#\|~\)' -exec rm \{\} \;
	@rm -f $(FILE).py
	@rm -f _$(FILE).so
	@rm -f image.*
	@echo "*.o *~ #*# and *.pyc files have been removed"

python:$(OBJECTS_WRAP) $(OBJECTS)
	$(CC) $(OBJECTS)  $(OBJECTS_WRAP) $(LFLAGS) -shared -o libpy/_knit.so 
	cp interface/knit.py libpy/


doc:
	doxygen info/knit_Doxyfile

tar:
	@rm SAVED*.date 
	@touch SAVED_"`date +%-e%b%y_%H:%M`".date
	@tar -cvzf $(FILE)_BACKUP"`date +%-e_%b`".tgz $(ALL_DIR_TO_SAVE)  \
        Makefile $(FILE)_Makefile SAVED*.date --exclude='*.o' --exclude='*_wrap.cxx'     \
	--exclude='*~' --exclude='*.pyc' --exclude='*.so'
	@echo ""
	@echo "tar BACKUP file created"

depend:
	makedepend -- $(CFLAGS) -- $(SOURCES) >& .dep

profiling: $(OBJECTS)
	@echo "-- Profiling of a rectangular system"
	@echo "-- Make sure that the -pg option has been used"	
	$(CC) -c $(CFLAGS) lib/profiling_2Drectangle.C
	$(CC) $(CFLAGS) -o profiling_2Drectangle.out $(LFLAGS) $(OBJECTS) profiling_2Drectangle.o
	@echo "-- Compilation done. Running the program"
	./profiling_2Drectangle.out
	@echo "-- Program done, running gprof"
	gprof profiling_2Drectangle.out > gprof.out
	@echo "-- Done. Results are in gprof.out"

# ***********************************************************
#  5. OLD TARGETS THAT NEED TO BE REFRESHED                 *
# ***********************************************************


# different automatic tests
test_mic:
	@echo "TESTING of knit_systeme.h[C]"
	@g++ -c -o kernel/knit_micromatrices.o -O2 -D_TESTING_ -D_DEBUG_LONG_ -I$(BLZHDR) -I$(CURDIR)/lib kernel/knit_micromatrices.C	
	@g++ -Wall -o test.out -O2 -llapack -lblitz kernel/knit_micromatrices.o
	@./test.out

test_res:
	@echo "TESTING of knit_reservoir.h[C]"
	@g++ -o kernel/knit_reservoir.o -c -O2 -D_TESTING_ -D_DEBUG_LONG_ -I$(BLZHDR) -I$(CURDIR)/lib kernel/knit_reservoir.C	
	@g++ -Wall -o test.out -O2 -llapack -lblitz kernel/knit_reservoir.o 
	@./test.out

test_sys: kernel/knit_micromatrices.o kernel/knit_reservoir.o
	@echo "TESTING of knit_systeme.h[C]"
	@g++ -c -o kernel/knit_system.o -O2 -D_TESTING_ -D_DEBUG_LONG_ -I$(BLZHDR) -I$(CURDIR)/lib kernel/knit_system.C	
	@g++ -Wall -o test.out -O2 -llapack -lblitz kernel/knit_system.o kernel/knit_micromatrices.o kernel/knit_reservoir.o
	@./test.out

test_geo: kernel/knit_micromatrices.o kernel/knit_system.o kernel/knit_reservoir.o
	@echo "TESTING of knit_geometry.h[C]"
	@g++ -o kernel/knit_geometry.o -c -O2 -D_TESTING_ -D_DEBUG_LONG_ -I$(BLZHDR) -I$(CURDIR)/lib kernel/knit_geometry.C	
	@g++ -Wall -o test.out -O2 -llapack -lblitz kernel/knit_system.o kernel/knit_micromatrices.o kernel/knit_geometry.o kernel/knit_reservoir.o
	@./test.out

test_knit: kernel/knit_micromatrices.o kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_geometry.o
	@echo "TESTING of knit_knit.h[C]"
	@g++ -o kernel/knit_knit.o -c -D_TESTING_ -I$(BLZHDR) -I$(CURDIR)/lib kernel/knit_knit.C 	
	@g++ -Wall -o test.out -fno-inline -fno-default-inline -llapack -lblitz kernel/knit_knit.o kernel/knit_micromatrices.o kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_geometry.o
	@./test.out

test_LDOS: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o kernel/knit_geometry.o kernel/knit_Python_Data.o
	@echo "LDOS error evaluation"
	g++ -o tmp/LDOS_error.o -c -O2 -D_TESTING_ -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib  tmp/LDOS_error.C	
	@g++ -Wall -o error.out -O2  -fno-inline -fno-default-inline -llapack -lblitz  -lpython2.3 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_geometry.o kernel/knit_Python_Data.o tmp/LDOS_error.o 
	./error.out examples/LDOS_error.input

test_BwFw: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o  kernel/knit_geometry.o kernel/knit_Python_Data.o
	@echo "GF backward forward test"
	@g++ -o tmp/BwFw_error.o -c -O2 -D_TESTING_  -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib tmp/BwFw_error.C	
	@g++ -Wall -o error.out -O2  -fno-inline -fno-default-inline -llapack -lblitz  -lpython2.3 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_geometry.o kernel/knit_Python_Data.o tmp/BwFw_error.o 
	./error.out examples/BwFw_error.input



#transmission calculations
TRAN: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_knit.o kernel/knit_Python_Data.o
	@echo "Find Transmission"
	@g++ -o tmp/TRAN.o -c -O2 -D_TESTING_  -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib  tmp/TRAN.C	
	@g++ -Wall -o trans.out -O2 -llapack -lblitz  -lpython2.3 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_knit.o kernel/knit_Python_Data.o tmp/TRAN.o 
	./trans.out tmp/TRAN.input

#density calculations
LDOS: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_Python_Data.o
	@echo "Find LDOS"
	@g++ -o tmp/LDOS.o -c -O2 -D_TESTING_ -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib tmp/LDOS.C 
	@g++ -Wall -o densi.out -O2 -llapack -lblitz  -lpython2.3 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_Python_Data.o tmp/LDOS.o 
	./densi.out tmp/LDOS.input

#density as function of energy calculations
LDOSen: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_Python_Data.o
	@echo "Find LDOS"
	@g++ -o tmp/LDOSen.o -c -O2 -D_TESTING_ -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib tmp/LDOSen.C	
	@g++ -Wall -o densi.out -O2 -llapack -lblitz  -lpython2.3 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_acos.o kernel/knit_geometry.o kernel/knit_Python_Data.o tmp/LDOSen.o 
	./densi.out tmp/LDOSen.input


# PROFILING
PROF: kernel/knit_micromatrices.o kernel/knit_reservoir.o kernel/knit_system.o kernel/knit_acos.o kernel/knit_geometry.o
	@echo "Profiling of a rectangular system"
	@g++ -o examples/PROF.o -c -O2 -D_TESTING_ -I$(BLZHDR) -I$(PYTHDR) -I$(CURDIR)/kernel -I$(CURDIR)/lib examples/PROF.C -pg	
	@g++ -Wall -o a.out -O2 kernel/knit_system.o kernel/knit_reservoir.o kernel/knit_micromatrices.o kernel/knit_acos.o kernel/knit_geometry.o examples/PROF.o $(LFLAGS) -pg
	@echo "Compilation done. Running the program"
	./a.out
	@echo "Program done, running gprof"
	@rm -f gprof.out
	@gprof > gprof.out
	@echo "Done. Results are in gprof.out"


test_mem:
	@echo "valgrind memory allocation TEST"
	@valgrind --gen-suppressions=yes ./test.out


