CC = g++

AR     = ar
RANLIB = ranlib

ARCH := $(shell uname -m)

ifeq ($(ARCH),x86_64)
	LIBDIR := /usr/lib64
#	ACMLDIR := /usr/local/acml/gnu64
	ACMLDIR := /usr/local/acml/gfortran64
else
	LIBDIR := /usr/lib
#	ACMLDIR := /usr/local/acml/gnu32
	ACMLDIR := /usr/local/acml/gfortran32
endif

EXPORT_PATH := export LD_LIBRARY_PATH='$(ACMLDIR)/lib:$(LD_LIBRARY_PATH)'

CFLAGS = -O3 -Ifoundation -Wall -I$(ACMLDIR)/include
PCFLAGS = -Wall -O0 -pg -ggdb -Ifoundation -I$(ACMLDIR)/include
DFLAGS = -Wall -g -ggdb -DLDEBUG -DYDEBUG -Ifoundation -DRK2DEBUG -DRK4DEBUG -I$(ACMLDIR)/include
SFLAGS = -O3 -fPIC -Ifoundation -Wall -I$(ACMLDIR)/include

LIBACML := $(ACMLDIR)/lib/libacml.a

LINKFLAGS = -lm -lstdc++ -lg2c -lgfortran

PLINKFLAGS = -lm -pg -lg2c
.SUFFIXES: .o .cc

HEADERS = hoct_model.h init.h util.h isac.h grids.h solver.h sol.h \
TimeIndex.h dysol.h nhar.h def.h header.h \
configuration.h SString.h

SIM_SRCS = hoct_model.cc init.cc sol.cc grids.cc solver.cc \
  util.cc isac.cc dyrk4.cc dytrd.cc nhar.cc \
  foundation/RStd.cc \
  cell.cc input.cc boundaries.cc device_structure.cc \
  fourier.cc initialization.cc output.cc solve.cc heatflow.cc \
  transient_bte.cc configuration.cc SString.cc
TEST_SRCS = main.cc 
ALL_SRCS = $(SIM_SRCS) $(TEST_SRCS)

SIM_OBJS = $(addprefix obj/,$(ALL_SRCS:.cc=.o))
PSIM_OBJS = $(addprefix pobj/, $(ALL_SRCS:.cc=.o))
DSIM_OBJS = $(addprefix dobj/, $(ALL_SRCS:.cc=.o))
SSIM_OBJS = $(addprefix sobj/, $(ALL_SRCS:.cc=.o))

TEST_OBJS = $(TEST_SRCS:.cc=.o)

solver :$(SIM_OBJS)
	$(CC) -o solver $(SIM_OBJS) $(LINKFLAGS) $(LIBACML) $(CFLAGS)

psolver :$(PSIM_OBJS)
	$(CC) -o psolver $(PSIM_OBJS) $(PLINKFLAGS) $(LIBACML) $(PCFLAGS)

dsolver :$(DSIM_OBJS)
	$(CC) -o dsolver $(DSIM_OBJS) $(LINKFLAGS) $(LIBACML) $(DFLAGS)

obj/boundaries.o: boundaries.cc def.h header.h
pobj/boundaries.o: boundaries.cc def.h header.h
dobj/boundaries.o: boundaries.cc def.h header.h
sobj/boundaries.o: boundaries.cc def.h header.h

obj/cell.o: cell.cc def.h header.h
pobj/cell.o: cell.cc def.h header.h
dobj/cell.o: cell.cc def.h header.h
sobj/cell.o: cell.cc def.h header.h

obj/configuration.o: configuration.cc configuration.h SString.h
pobj/configuration.o: configuration.cc configuration.h SString.h
dobj/configuration.o: configuration.cc configuration.h SString.h
sobj/configuration.o: configuration.cc configuration.h SString.h

obj/device_structure.o: device_structure.cc util.h def.h header.h configuration.h isac.h hoct_model.h grids.h
pobj/device_structure.o: device_structure.cc util.h def.h header.h configuration.h isac.h hoct_model.h grids.h
dobj/device_structure.o: device_structure.cc util.h def.h header.h configuration.h isac.h hoct_model.h grids.h
sobj/device_structure.o: device_structure.cc util.h def.h header.h configuration.h isac.h hoct_model.h grids.h

obj/dyrk4.o: dyrk4.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
pobj/dyrk4.o: dyrk4.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
dobj/dyrk4.o: dyrk4.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
sobj/dyrk4.o: dyrk4.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h

obj/dytrd.o: dytrd.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
pobj/dytrd.o: dytrd.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
dobj/dytrd.o: dytrd.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h
sobj/dytrd.o: dytrd.cc solver.h hoct_model.h util.h isac.h grids.h dysol.h TimeIndex.h

obj/fourier.o: fourier.cc def.h header.h
pobj/fourier.o: fourier.cc def.h header.h
dobj/fourier.o: fourier.cc def.h header.h
sobj/fourier.o: fourier.cc def.h header.h

obj/grids.o: grids.cc grids.h isac.h hoct_model.h sol.h init.h 
pobj/grids.o: grids.cc grids.h isac.h hoct_model.h sol.h init.h  
dobj/grids.o: grids.cc grids.h isac.h hoct_model.h sol.h init.h  
sobj/grids.o: grids.cc grids.h isac.h hoct_model.h sol.h init.h 

obj/heatflow.o: heatflow.cc header.h def.h
pobj/heatflow.o: heatflow.cc header.h def.h
dobj/heatflow.o: heatflow.cc header.h def.h
sobj/heatflow.o: heatflow.cc header.h def.h

obj/hoct_model.o: hoct_model.cc util.h isac.h hoct_model.h grids.h
pobj/hoct_model.o: hoct_model.cc util.h isac.h hoct_model.h grids.h
dobj/hoct_model.o: hoct_model.cc util.h isac.h hoct_model.h grids.h
sobj/hoct_model.o: hoct_model.cc util.h isac.h hoct_model.h grids.h

obj/init.o: init.cc init.h hoct_model.h isac.h sol.h util.h grids.h 
pobj/init.o: init.cc init.h hoct_model.h isac.h sol.h util.h grids.h 
dobj/init.o: init.cc init.h hoct_model.h isac.h sol.h util.h grids.h 
sobj/init.o: init.cc init.h hoct_model.h isac.h sol.h util.h grids.h 

obj/initialization.o: initialization.cc def.h header.h
pobj/initialization.o: initialization.cc def.h header.h
dobj/initialization.o: initialization.cc def.h header.h
sobj/initialization.o: initialization.cc def.h header.h

obj/input.o: input.cc def.h header.h
pobj/input.o: input.cc def.h header.h
dobj/input.o: input.cc def.h header.h
sobj/input.o: input.cc def.h header.h

obj/isac.o: isac.cc isac.h hoct_model.h sol.h init.h util.h grids.h dysol.h nhar.h configuration.h TimeIndex.h
pobj/isac.o: isac.cc isac.h hoct_model.h sol.h init.h util.h grids.h dysol.h nhar.h configuration.h TimeIndex.h
dobj/isac.o: isac.cc isac.h hoct_model.h sol.h init.h util.h grids.h dysol.h nhar.h configuration.h TimeIndex.h
sobj/isac.o: isac.cc isac.h hoct_model.h sol.h init.h util.h grids.h dysol.h nhar.h configuration.h TimeIndex.h

obj/main.o: main.cc hoct_model.h isac.h grids.h util.h header.h def.h configuration.h
pobj/main.o: main.cc hoct_model.h isac.h grids.h util.h header.h def.h configuration.h
dobj/main.o: main.cc hoct_model.h isac.h grids.h util.h header.h def.h configuration.h
sobj/main.o: main.cc hoct_model.h isac.h grids.h util.h header.h def.h configuration.h

obj/nhar.o: nhar.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h 
pobj/nhar.o: nhar.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h 
dobj/nhar.o: nhar.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h 
sobj/nhar.o: nhar.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h 

obj/output.o: output.cc def.h header.h
pobj/output.o: output.cc def.h header.h
dobj/output.o: output.cc def.h header.h
sobj/output.o: output.cc def.h header.h

obj/sol.o: sol.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h configuration.h
pobj/sol.o: sol.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h configuration.h
dobj/sol.o: sol.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h configuration.h
sobj/sol.o: sol.cc sol.h hoct_model.h init.h isac.h dysol.h util.h grids.h TimeIndex.h nhar.h solver.h configuration.h

obj/solve.o: solve.cc def.h header.h
pobj/solve.o: solve.cc def.h header.h
dobj/solve.o: solve.cc def.h header.h
sobj/solve.o: solve.cc def.h header.h

obj/solver.o: solver.cc solver.h hoct_model.h util.h isac.h grids.h
pobj/solver.o: solver.cc solver.h hoct_model.h util.h isac.h grids.h
dobj/solver.o: solver.cc solver.h hoct_model.h util.h isac.h grids.h
sobj/solver.o: solver.cc solver.h hoct_model.h util.h isac.h grids.h

obj/SString.o: SString.cc SString.h
pobj/SString.o: SString.cc SString.h
dobj/SString.o: SString.cc SString.h
sobj/SString.o: SString.cc SString.h

obj/transient_bte.o: transient_bte.cc header.h def.h
pobj/transient_bte.o: transient_bte.cc header.h def.h
dobj/transient_bte.o: transient_bte.cc header.h def.h
sobj/transient_bte.o: transient_bte.cc header.h def.h

obj/util.o: util.cc util.h isac.h hoct_model.h init.h grids.h
pobj/util.o: util.cc util.h isac.h hoct_model.h init.h grids.h
dobj/util.o: util.cc util.h isac.h hoct_model.h init.h grids.h
sobj/util.o: util.cc util.h isac.h hoct_model.h init.h grids.h

obj/%.o: %.cc
	$(CC) $(CFLAGS) -c -o $@ $<

pobj/%.o: %.cc
	$(CC) $(PCFLAGS) -c -o $@ $<

dobj/%.o: %.cc
	$(CC) $(DFLAGS) -c -o $@ $<

sobj/%.o: %.cc
	$(CC) $(SFLAGS) -c -o $@ $<

clean:
	rm -rf obj/*.o obj/foundation/*.o dobj/*.o dobj/foundation/*.o pobj/*.o pobj/foundation/*.o sobj/*.o sobj/foundation/*.o *.o solver psolver dsolver core.* gmon.out

cleanf:
	rm -rf obj/*.o solver core.*

cleanp:
	rm -rf pobj/*.o psolver core.* gmon.out

cleand:
	rm -rf dobj/*.o dsolver core.*

