BENCHFILE = benchdp
TESTFILE = testdp
DIMELIB = libdimepack.a
SHELL = /bin/sh

all: norm.h dpLAPACK.h distribution $(DIMELIB) $(TESTFILE) $(BENCHFILE)

include dependencies.incl
include make.incl
include make.incl.general

RELAXDIR = smoother
INTERPDIR = interpolation
RESTRICTDIR = restriction
PADDIR = padding
PRECGOPSDIR = pre-coarse-grid-ops
POSTCGOPSDIR = post-coarse-grid-ops

VPATH = ./$(RELAXDIR):./$(INTERPDIR):./$(RESTRICTDIR):./$(PRECGOPSDIR):./$(POSTCGOPSDIR):./$(PADDIR):.
INCLUDES = -I$(PADDIR) -I$(RELAXDIR) -I$(INTERPDIR) -I$(RESTRICTDIR) -I$(PRECGOPSDIR) -I$(POSTCGOPSDIR)
LDPATH+= -L$(PADDIR) -L.

RM = rm -rf
AR = ar
M4 = m4
PADLIB = $(PADDIR)/libpadutils.a

OFILESFORLIB = dpRestrictRhs.o dpFuncPtr.o dpConstCoeff.o dpDirectSolve.o dpBuild5pCMatrix.o\
	dpBuild9pCMatrix.o dpGrid2d.o dpMgData.o $(RELAXDIR)/relax.o\
	$(INTERPDIR)/interpolation.o $(RESTRICTDIR)/restriction.o\
	$(PRECGOPSDIR)/cleanuc.o $(POSTCGOPSDIR)/ipo-relax-5.o $(POSTCGOPSDIR)/ipo-relax-9.o\
	$(PRECGOPSDIR)/relax-restrict-hw-5.o $(PRECGOPSDIR)/relax-restrict-hw-5-o.o \
	$(PRECGOPSDIR)/relax-restrict-fw-5.o $(PRECGOPSDIR)/relax-restrict-fw-5-o.o \
	$(PRECGOPSDIR)/relax-restrict-hw-9-o.o $(PRECGOPSDIR)/relax-restrict-fw-9-o.o \
	dpApplyPadding.o dpUtilities.o norm.o

OFILES = $(OFILESFORLIB) $(TESTFILE).o $(BENCHFILE).o

distribution:
	cd $(RELAXDIR); $(MAKE)
	cd $(INTERPDIR); $(MAKE)
	cd $(RESTRICTDIR); $(MAKE)
	cd $(POSTCGOPSDIR); $(MAKE)
	cd $(PRECGOPSDIR); $(MAKE)
	cd $(PADDIR); $(MAKE)

dpConstCoeff.C: dpConstCoeff.C.m4
	$(M4) $(M4CCFLAGS) $< > $@

dpDirectSolve.C: dpDirectSolve.C.m4
	$(M4) $(M4CCFLAGS) $< > $@

dpBuild5pCMatrix.C: dpBuild5pCMatrix.C.m4
	$(M4) $(M4CCFLAGS) $< > $@

dpBuild9pCMatrix.C: dpBuild9pCMatrix.C.m4
	$(M4) $(M4CCFLAGS) $< > $@

dpFuncPtr.C: dpFuncPtr.C.m4
	$(M4) $(M4CCFLAGS) $< > $@

norm.h: norm.h.m4
	$(M4) $(M4FCCFLAGS) $< > $@

norm.f: norm.f.m4
	$(M4) $(M4F77FLAGS) $< > $@

dpLAPACK.h: dpLAPACK.h.m4
	$(M4) $(M4CCFLAGS) $< > $@

$(DIMELIB): $(OFILESFORLIB)
	$(AR) -r $@ $(OFILESFORLIB) 

$(TESTFILE): $(TESTFILE).o $(DIMELIB) $(PADLIB)
	$(CC) $(CCFLAGS) $(TESTFILE).o $(LDFLAGS) $(LDPATH) $(LDLIBS) -o $(TESTFILE)

$(BENCHFILE): benchdp.o $(DIMELIB) $(PADLIB)
	$(CC) $(CCFLAGS) $(BENCHFILE).o $(LDFLAGS) $(LDPATH) $(LDLIBS) -o $(BENCHFILE)

clean:
	$(RM) *.dat* *~ *.o dpConstCoeff.C dpDirectSolve.C dpBuild5pCMatrix.C\
	dpBuild9pCMatrix.C $(TESTFILE) $(BENCHFILE) $(DIMELIB) Templates.DB\
	core norm.f norm.h dpFuncPtr.C dpLAPACK.h
	cd $(PADDIR); $(MAKE) clean

cleanall:
	$(RM) *.dat* *~ *.o dpConstCoeff.C dpDirectSolve.C dpBuild5pCMatrix.C\
	dpBuild9pCMatrix.C $(TESTFILE) $(BENCHFILE) $(DIMELIB) Templates.DB\
	core norm.f norm.h dpFuncPtr.C dpLAPACK.h
	cd $(RELAXDIR); $(MAKE) clean
	cd $(INTERPDIR); $(MAKE) clean
	cd $(RESTRICTDIR); $(MAKE) clean
	cd $(POSTCGOPSDIR); $(MAKE) clean
	cd $(PRECGOPSDIR); $(MAKE) clean
	cd $(PADDIR); $(MAKE) clean

##########################
# general compiling rule #
##########################


.C.o: $*.h
	$(CC) $(CCFLAGS) -c $*.C

.f.o: 
	$(F77) $(F77FLAGS) -c $*.f
