#!/usr/bin/env gmake

#####################################################################
# PARPP3D++                                                         #
# A parallel 3D Navier-Stokes-solver.                               #
#                                                                   #
# PARALLEL VERSION OF PP3D                                          #
# FROM THE FINITE ELEMENT ANALYSIS & SOLUTION PACKAGE               #
# FEATFLOW (www.featflow.de)                                        #
#                                                                   #
# WRITTEN IN C++                                                    #
#                                                                   #
# Makefile for linear algebra library, Version 2.0                  #
#                                                                   #
#####################################################################

# Location of parpp3d++
SRCDIR   = ..

include $(SRCDIR)/Makefile.inc

# List of all object files
OBJ = $(SRCLIST_LINLIB:%.cc=$(OBJDIR)/%.o)

# Set additional include path
INC_ADD = -I$(LINLIB) -I$(SRCDIR)


# default target: compile the library
default:        $(OBJDIR)/liblin.a

# 'make debug' will compile without optimisation and with debug symbols
debug:
	@$(MAKE) OPT=NO

lib:            $(OBJDIR)/liblin.a

liblin:         $(OBJDIR)/liblin.a

liblin.a:       $(OBJDIR)/liblin.a

$(OBJDIR)/liblin.a: $(OBJ)
	$(AR) $@ $(OBJ)
	$(RANLIB) $@

clean:          clean_lib

# Clean all object files for current architecture
clean_lib:
	-rm -f $(OBJ)
	-rm -f $(OBJDIR)/liblin.a

# Clean all object files for all architectures
purge:          clean
	-(cd $(dir $(OBJDIR)) && \
	    rm -f $(SRCLIST_LINLIB:%.cc=*/%.o) \
		  $(SRCLIST_LINLIB:%.cc=*/%.ti) */liblin.a )

# Dependencies of each object file
$(OBJDIR)/DateTime.o: \
	DateTime.cc DateTime.h Output.h $(SRCDIR)/MyTypes.h

$(OBJDIR)/DoubleArray.o: \
	DoubleArray.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/Global.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleArray2D.o: \
	DoubleArray2D.cc DoubleArray.h DoubleArray2D.h DoubleVector.h \
	IntArray.h IntVector.h Output.h Protypes.h RealArray.h RealVector.h \
	$(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleArray3D.o: \
	DoubleArray3D.cc DoubleArray3D.h Output.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleCompactMatrix.o: \
	DoubleCompactMatrix.cc DoubleArray.h DoubleArray2D.h \
	DoubleCompactMatrix.h DoubleVector.h IntArray.h Output.h \
	$(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleFullMatrix.o: \
	DoubleFullMatrix.cc DoubleArray2D.h DoubleFullMatrix.h DoubleVector.h \
	Output.h $(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleRectMatrix.o: \
	DoubleRectMatrix.cc DoubleArray.h DoubleRectMatrix.h DoubleVector.h \
	IntArray.h Output.h $(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h \
	$(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/DoubleVector.o: \
	DoubleVector.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/IntArray.o: \
	IntArray.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/IntArray2D.o: \
	IntArray2D.cc DoubleArray.h DoubleVector.h IntArray.h IntArray2D.h \
	IntVector.h Output.h Protypes.h RealArray.h RealVector.h \
	$(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/IntArray3D.o: \
	IntArray3D.cc IntArray3D.h Output.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/IntFullMatrix.o: \
	IntFullMatrix.cc IntArray2D.h IntFullMatrix.h IntVector.h Output.h \
	$(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/IntVector.o: \
	IntVector.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/MemInfo.o: \
	MemInfo.cc MemInfo.h Output.h $(SRCDIR)/MyTypes.h

$(OBJDIR)/MultiCompactMatrix.o: \
	MultiCompactMatrix.cc DoubleArray.h DoubleArray2D.h \
	DoubleCompactMatrix.h DoubleVector.h IntArray.h MultiCompactMatrix.h \
	MultiVector.h Output.h $(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h \
	$(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/MultiRectMatrix.o: \
	MultiRectMatrix.cc DoubleArray.h DoubleRectMatrix.h DoubleVector.h \
	IntArray.h MultiRectMatrix.h Output.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/MultiVector.o: \
	MultiVector.cc DoubleVector.h MultiVector.h Output.h \
	$(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h \
	$(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/Output.o: \
	Output.cc Output.h $(SRCDIR)/MyTypes.h

$(OBJDIR)/RealArray.o: \
	RealArray.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/RealArray2D.o: \
	RealArray2D.cc Output.h RealArray2D.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/RealArray3D.o: \
	RealArray3D.cc Output.h RealArray3D.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/RealCompactMatrix.o: \
	RealCompactMatrix.cc IntArray.h Output.h RealArray.h \
	RealCompactMatrix.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/RealFullMatrix.o: \
	RealFullMatrix.cc Output.h RealArray2D.h RealFullMatrix.h \
	RealVector.h $(SRCDIR)/coutput.h $(SRCDIR)/Errorcodes.h \
	$(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h $(SRCDIR)/typecasts.h

$(OBJDIR)/RealVector.o: \
	RealVector.cc DoubleArray.h DoubleVector.h IntArray.h IntVector.h \
	Output.h Protypes.h RealArray.h RealVector.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

# Compile statement for each object file
$(OBJ):
	-@test -d $(OBJDIR) || mkdir -p $(OBJDIR)
	$(CPP) $(DEFINES) $(CFLAGSCPP) $(INC_ADD) $(INC) -c $< -o $@

# For explanation of phony targets see
# http://www.gnu.org/software/make/manual/html_mono/make.html#SEC41
.PHONY: default lib liblin liblin.a clean clean_lib purge
