#
# This is a makefile for GRAPE-DR.
# For other architectures, set GARCH and HIB as follows:
#
#          GRAPE-DR   GRAPE-7   GRAPE-6BX     GRAPE-6A   Phantom-GRAPE-5
# GARCH    gdr        g7        g6bx          g6a        pg5
# HIB      hib        hib       g6bxhib       -          -
#
# For GRAPE-DR, GRAPE-7 and GRAPE-6BX, set HIBLIB
# and LINKHIB as follows:
#   HIBLIB   = $(LIBPATH)/lib$(HIB).a
#   LINKHIB  = -l$(HIB)
#
# For Phantom-GRAPE-5 with OpenMP enabled, set LDFLAGS and CFLAGS as follows:
#   LDFLAGS += -fopenmp
#   CFLAGS += -fopenmp
#
# For CUDA G5/G6, set LDFLAGS and CFLAGS as follows:
#   LDFLAGS += -L$(cudapath)/lib -lcudart
# Here, 'cudapath' and 'cudasdkpath' denotes the path which
# CUDA Toolkit and SDK are installed into.
# By default, numerical format 'double single' is used.
# For single-precision, use '-lcuda5s' instead of '-cuda5'.
#
# An architecuture-independent makefile can be found at Makefile.generic.
#

GARCH    = gdr
HIB      = hib
INCPATH  = ../../include
LIBPATH  = ../../lib

HIBLIB  = $(LIBPATH)/lib$(HIB).a
LINKHIB = -l$(HIB)

CC = gcc 

# if you have io_nemo lib (written by JCL@Observatoire de Marseille)
# IONEMOFLAGS = -DIONEMO
# IONEMOLIB = -L$(NEMOLIB) -lio_nemo -lnemo
#
#
# use pob format for file I/O
# POBLIB = -lpob -lz
# POBFLAGS = -DUSEPOB=1
# pob is a paricle oriented, binary, and gzipped format.
# pob utily is available on request
# 
# USEX11: use animation tools.
# VECTORIZED: activate functions in treev.c. faster on vector
#             processor and some other platforms.
# BFLOAD: activate functions in treebfl.c. performs breadth-first
#         tree construction. may be slightly faster on vector processor.
# DYNMEM: use dynamic memory allocation. should be set to 1 unless you
#         have any special reason.

STDOBJS = tree.o direct.o sort.o cputime.o viewtree.o p2m2.o mr1interface.o
LDFLAGS = -O2 -L. -L$(LIBPATH) -L/usr/local/lib
LIBS = $(POBLIB) $(IONEMOLIB) -lm
# AOBJS = animation.o Xtc.o
# ALIBS = -lX11
# ALIBPATH = /usr/X11R6/lib
# AFLAGS = -DANIM

# for host only
# LIBOBJS = $(STDOBJS) force_md2.o
# GFLAGS = -DNOGRAPE
#
# for MDGRAPE-2
# LIBOBJS = $(STDOBJS) force_md2.o
# GLIBPATH = /usr/local/lib
# GLIBS = -lm2
# GFLAGS = -DMDGRAPE2

LIBOBJS = $(STDOBJS) force_g7.o

ifeq ($(GARCH), cuda)
  # for CUDA G5
  GLIBPATH = $(LIBPATH)
  GLIBS = -l$(GARCH)5s $(LINKHIB)
else
  # for GRAPE-7/G5PIPE
  GLIBPATH = $(LIBPATH)
  GLIBS = -l$(GARCH)5 $(LINKHIB)
endif

CFLAGS += -O2 -I. -I$(INCPATH) -I/usr/local/include -o $@ \
          $(IONEMOFLAGS) $(POBFLAGS) -DUSEX11=0 -DVECTORIZED=0 -DBFLOAD=0\
       -DDYNMEM=1 $(GMFLAGS)

all:	vtc_$(GARCH) vtc_direct_$(GARCH) vtc_noforce_$(GARCH) libvtc.a

vtc_$(GARCH):	vtc.c $(GOBJS) $(AOBJS) libvtc.a $(HIBLIB)
	$(CC) $(GFLAGS) $(CFLAGS) $(AFLAGS) -L$(ALIBPATH) -L$(GLIBPATH) $(LDFLAGS) $< \
	$(GOBJS) $(AOBJS) libvtc.a $(GLIBS) $(ALIBS) $(LIBS)

vtc_cosmo_$(GARCH):	vtc.c $(GOBJS) $(AOBJS) libvtc.a $(HIBLIB)
	$(CC) -DCOSMO=1 $(GFLAGS) $(CFLAGS) $(AFLAGS) -L$(ALIBPATH) -L$(GLIBPATH) $(LDFLAGS) $< \
	$(GOBJS) $(AOBJS) libvtc.a $(GLIBS) $(ALIBS) $(LIBS)

vtc_direct_$(GARCH):	vtc.c $(GOBJS) $(AOBJS) libvtc.a $(HIBLIB)
	$(CC) -DDIRECT=1 $(GFLAGS) $(CFLAGS) $(AFLAGS) -L$(ALIBPATH) -L$(GLIBPATH) $(LDFLAGS) $< \
	$(GOBJS) $(AOBJS) libvtc.a $(GLIBS) $(ALIBS) $(LIBS)

vtc_noforce_$(GARCH):	vtc.c $(GOBJS) $(AOBJS) libvtc.a $(HIBLIB)
	$(CC) -DNOFORCE=1 $(GFLAGS) $(CFLAGS) $(AFLAGS) -L$(ALIBPATH) -L$(GLIBPATH) $(LDFLAGS) $< \
	$(GOBJS) $(AOBJS) libvtc.a $(GLIBS) $(ALIBS) $(LIBS)

libvtc.a: $(LIBOBJS)
	ar ruv $@ $?

force_md2.o:	force_md2.c
	$(CC) $(CFLAGS) $(GFLAGS) -c $<

force_g5.o:	force_g5.c
	$(CC) $(CFLAGS) $(GFLAGS) -c $<

tree.o:			tree.c treev.c treebfl.c highorder.c debug.c

clean:
	-rm *.o *.a vtc_* *~

bak:
	tar cvf bak.tar ./Makefile*[a-zA-Z0-9] ./*.[hcCfF] ./*.table ./00README
	gzip bak.tar
