#
# Makefile for JVL
#
# It is assumed here that the following libraries have already been built,
# in the same precision (single or double) as used for JVL:
#
#     libPlt.a
#     eispack.a
#
# Actual library filenames are defined in the compiler-setup sections below
#

#BINDIR = .
BINDIR = /Users/drela/Codes/bin/

INSTALLCMD = install -s

SRC = ../src


#PROGS = jvl dtest
PROGS = jvl 

JVLOBJ = jvl_inc.o jvlheap.o \
jvl.o joper.o jmode.o jmass.o jexec.o jvsum.o jsetup.o \
jmake.o jinput.o joutput.o jaero.o jtrim.o \
jsfforc.o jbdforc.o jtpforc.o \
jaic.o airutil.o jutil.o \
jplotvl.o jplottp.o jplotmd.o limits.o \
cdcl.o \
pltops.o hidden.o \
plsubs.o \
userio.o plutil.o arrow3d.o getvm.o \
spline.o sgutil.o \
second.o \
linchk.o

###================================================
###  Compilers and flags

#--------------------------
### Intel Fortran Compiler 8.x
#FC = ifort
#FFLAGS = -O 
#PLTLIB = -L/usr/X11R6/lib -lX11
#FTNLIB = -Vaxlib /usr/lib/C-ctype.o /usr/lib/C_name.o /usr/lib/ctype-info.o
#FTNLIB = -Vaxlib -i_dynamic
#FTNLIB = -Vaxlib
##--------------------------
### double-precision option (also need double precision Eispack and libPlt)
#FFLAGS = -O -r8 -ftrapuv -fpe0 -CB
#FFLAGS = -O -r8  
#PLTOBJ = ../plotlib/libPltDP.a 
# computer-clock routine
#SECOND = second_ifc.f

#-----------------------------------------------
### Gfortran
FC = gfortran

PLTLIB = -L/usr/X11R6/lib -lX11

EIGOBJ = ../eispack/libeispack.a

# single precision
DP =
PLTOBJ = ../plotlib/libPlt_gSP.a 

# double precision (recommended)
DP = -fdefault-real-8
PLTOBJ = ../plotlib/libPlt_gDP.a 

MATOBJ =
MLIBS =
MSOLV =

# Use the lapack solver for faster matrix solves
# This requires AVL to be linked with system lapack and blas libraries
# Single precision interface to LAPACK
#MATOBJ = matrix-lapacksp.o
# Double precision interface to LAPACK
MATOBJ = matrix-lapackdp.o 

# Solver extracted from BLAS and LAPACK if no fast libs are available
#MSOLV = matrix-lapacksubs.o

# System libraries for LAPACK solvers
#MLIBS = -llapack -lblas
#MLIBS = -L/opt/local/lib -lopenblas
MLIBS = \
/usr/local/Cellar/openblas/0.3.28/lib/libopenblasp-r0.3.28.dylib \
/usr/local/Cellar/lapack/3.12.0/lib/liblapack.3.12.0.dylib

# If available link with the very fast Intel Math Kernel Library
#MLIBS = -lmkl

# optimization flag
OPT = -O2
OPT = -O0 -g -C
#OPT = -O0

# various error-checking flags (code will run slower with these)
ACHK =
#ACHK = -fbounds-check -finit-real=inf -finit-integer=2000000000 -ffpe-trap=invalid,zero

FFLAGSO = $(OPT) $(DP)
FFLAGNODP = $(OPT)
FFLAGS = $(OPT) $(DP) $(ACHK)

# computer-clock routine
SECOND = second_g77.f

#-----------------------------------------------


all:	 $(PROGS)

install: $(PROGS)
	$(INSTALLCMD) $(PROGS) $(BINDIR)

clean: 
	-/bin/rm $(PROGS)
	-/bin/rm *.o *.mod

$(SRC)/jvl.inc: $(SRC)/jindex.inc
	touch $(SRC)/jvl.inc

jvl: $(JVLOBJ) $(MATOBJ) $(MSOLV) 
	$(FC) -g -o jvl $(JVLOBJ) $(MATOBJ) $(MSOLV) $(EIGOBJ) $(PLTOBJ) $(PLTLIB)  $(MLIBS) 
#	$(INSTALLCMD) jvl $(BINDIR)

dtest: $(SRC)/dtest.f
	$(FC) -o dtest $(FFLAGS) -fdollar-ok $(SRC)/dtest.f


jvl_inc.o: $(SRC)/jvl_inc.f90 
	$(FC) -c $(FFLAGS) $(SRC)/jvl_inc.f90
jvlheap.o: $(SRC)/jvlheap.f90
	$(FC) -c $(FFLAGS) $(SRC)/jvlheap.f90
jvl.o: $(SRC)/jvl.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc
	$(FC) -c $(FFLAGS) $(SRC)/jvl.f
joper.o: $(SRC)/joper.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc
	$(FC) -c $(FFLAGS) $(SRC)/joper.f
jmode.o: $(SRC)/jmode.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc
	$(FC) -c $(FFLAGS) $(SRC)/jmode.f
jmass.o: $(SRC)/jmass.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jmass.f
jexec.o: $(SRC)/jexec.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jexec.f
jvsum.o: $(SRC)/jvsum.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jvsum.f
jsetup.o: $(SRC)/jsetup.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jsetup.f
jmake.o: $(SRC)/jmake.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jmake.f
jinput.o: $(SRC)/jinput.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jinput.f
joutput.o: $(SRC)/joutput.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/joutput.f
jaero.o: $(SRC)/jaero.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jaero.f
getvm.o: $(SRC)/getvm.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/getvm.f
jtrim.o: $(SRC)/jtrim.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jtrim.f
jsfforc.o: $(SRC)/jsfforc.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jsfforc.f
jsjforc.o: $(SRC)/jsjforc.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jsjforc.f
jbdforc.o: $(SRC)/jbdforc.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jbdforc.f
jtpforc.o: $(SRC)/jtpforc.f $(SRC)/jvl.inc
	$(FC) -c $(FFLAGS) $(SRC)/jtpforc.f
jplotvl.o: $(SRC)/jplotvl.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc $(SRC)/masks.inc
	$(FC) -c $(FFLAGS) $(SRC)/jplotvl.f
jplottp.o: $(SRC)/jplottp.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc $(SRC)/masks.inc
	$(FC) -c $(FFLAGS) $(SRC)/jplottp.f
jplotmd.o: $(SRC)/jplotmd.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc $(SRC)/masks.inc
	$(FC) -c $(FFLAGS) $(SRC)/jplotmd.f
limits.o: $(SRC)/limits.f $(SRC)/jvl.inc $(SRC)/jvlplt.inc
	$(FC) -c $(FFLAGS) $(SRC)/limits.f
pltops.o: $(SRC)/pltops.f $(SRC)/jvlplt.inc
	$(FC) -c $(FFLAGS) $(SRC)/pltops.f
plsubs.o: $(SRC)/plsubs.f $(SRC)/jindex.inc
	$(FC) -c $(FFLAGS) $(SRC)/plsubs.f
hidden.o: $(SRC)/hidden.f
	$(FC) -c $(FFLAGS) $(SRC)/hidden.f
jaic.o: $(SRC)/jaic.f
	$(FC) -c $(FFLAGS) $(SRC)/jaic.f
cdcl.o: $(SRC)/cdcl.f
	$(FC) -c $(FFLAGS) $(SRC)/cdcl.f
userio.o: $(SRC)/userio.f
	$(FC) -c $(FFLAGS) $(SRC)/userio.f
plutil.o: $(SRC)/plutil.f $(SRC)/masks.inc
	$(FC) -c $(FFLAGS) $(SRC)/plutil.f
arrow3d.o: $(SRC)/arrow3d.f
	$(FC) -c $(FFLAGS) $(SRC)/arrow3d.f

spline.o: $(SRC)/spline.f
	$(FC) -c $(FFLAGS) $(SRC)/spline.f
sgutil.o: $(SRC)/sgutil.f
	$(FC) -c $(FFLAGS) $(SRC)/sgutil.f
airutil.o: $(SRC)/airutil.f
	$(FC) -c $(FFLAGS) $(SRC)/airutil.f
jutil.o: $(SRC)/jutil.f
	$(FC) -c $(FFLAGS) $(SRC)/jutil.f

matrix-lapacksp.o: $(SRC)/matrix-lapacksp.f
	$(FC) -c $(FFLAGS)  $(SRC)/matrix-lapacksp.f
matrix-lapackdp.o: $(SRC)/matrix-lapackdp.f
	$(FC) -c $(FFLAGS)  $(SRC)/matrix-lapackdp.f

matrix-numrec.a: $(SRC)/matrix-numrec.f
	$(FC) -c $(FFLAGSO) $(SRC)/matrix-numrec.f
	ar r matrix-numrec.a matrix-numrec.o
	ranlib matrix-numrec.a

#matrix-lapacksubs.a: $(SRC)/matrix-lapacksubs.f
#	$(FC) -c $(FFLAGSO) $(SRC)/matrix-lapacksubs.f
#	ar r matrix-lapacksubs.a matrix-lapacksubs.o
#	ranlib matrix-lapacksubs.a

matrix-lapacksubs.o: $(SRC)/matrix-lapacksubs.f
	$(FC) -c $(FFLAGNODP) $(SRC)/matrix-lapacksubs.f

second.o: $(SRC)/$(SECOND)
	cp $(SRC)/$(SECOND) $(SRC)/second.f
	$(FC) -c $(FFLAGS) $(SRC)/second.f

linchk.o: $(SRC)/linchk.f $(SRC)/jvl.inc
	$(FC) -c $(OPT) $(DP) -fdollar-ok $(SRC)/linchk.f
