#!/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 parallel linear algebra library, Version 2.0         #
#                                                                   #
#####################################################################

# Location of parpp3d++
SRCDIR   = ..

include $(SRCDIR)/Makefile.inc

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

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


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

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

lib:            $(OBJDIR)/libparlin.a

libparlin:      $(OBJDIR)/libparlin.a

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

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

clean:          clean_lib

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

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

# Dependencies of each object file
TYPICAL_DEP_LIST = \
	$(HDRS_LINLIB) $(SRCDIR)/cinput.h $(SRCDIR)/coutput.h \
	$(SRCDIR)/Errorcodes.h $(SRCDIR)/Global.h $(SRCDIR)/MyTypes.h \
	$(SRCDIR)/typecasts.h

$(OBJDIR)/ParCompactMatrix.o: \
	ParCompactMatrix.cc MG_Info.h ParCompactMatrix.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParNonParamElement_3D.h ParNonParamMeanElement_3D.h \
	ParRotatedElement_3D.h ParTrilinearElement_3D.h ParVector.h \
	$(HDRS_FINITELIB) $(TYPICAL_DEP_LIST) $(HDRS_COMTOOL) \
	$(SRCDIR)/CCoarseGrid.h $(SRCDIR)/Daten.h $(SRCDIR)/FeatDomainBound.h \
	$(SRCDIR)/ParGrid.h $(SRCDIR)/PostGrid.h $(SRCDIR)/String.h \
	$(SRCDIR)/Task.h

$(OBJDIR)/ParMultiGrid_3D.o: \
	ParMultiGrid_3D.cc MG_Info.h ParCompactMatrix.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParVector.h $(FINITELIB)/FiniteElement_3D.h \
	$(FINITELIB)/NumIntegration_3D.h $(FINITELIB)/SquareGrid_3D.h \
	$(TYPICAL_DEP_LIST) $(COMTOOL)/blist.h $(COMTOOL)/CComTool.h \
	$(COMTOOL)/Const.h 

$(OBJDIR)/ParNonParamElement_3D.o: \
	ParNonParamElement_3D.cc MG_Info.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParNonParamElement_3D.h ParVector.h \
	$(FINITELIB)/FiniteElement_3D.h $(FINITELIB)/NumIntegration_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(TYPICAL_DEP_LIST) $(COMTOOL)/Const.h

$(OBJDIR)/ParNonParamMeanElement_3D.o: \
	ParNonParamMeanElement_3D.cc MG_Info.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParNonParamMeanElement_3D.h ParVector.h \
	$(FINITELIB)/FiniteElement_3D.h $(FINITELIB)/NumIntegration_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(TYPICAL_DEP_LIST) $(COMTOOL)/Const.h

$(OBJDIR)/ParRotatedElement_3D.o: \
	ParRotatedElement_3D.cc MG_Info.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParRotatedElement_3D.h ParVector.h \
	$(FINITELIB)/FiniteElement_3D.h $(FINITELIB)/NumIntegration_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(TYPICAL_DEP_LIST) $(COMTOOL)/Const.h

$(OBJDIR)/ParTrilinearElement_3D.o: \
	ParTrilinearElement_3D.cc MG_Info.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParTrilinearElement_3D.h ParVector.h \
	$(FINITELIB)/FiniteElement_3D.h $(FINITELIB)/NumIntegration_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/ParVector.o: \
	ParVector.cc MG_Info.h ParCompactMatrix.h ParFiniteElement_3D.h \
	ParMultiGrid_3D.h ParNonParamElement_3D.h ParNonParamMeanElement_3D.h \
	ParRotatedElement_3D.h ParTrilinearElement_3D.h ParVector.h \
	$(FINITELIB)/ConstantElement_3D.h $(FINITELIB)/FiniteElement_3D.h \
	$(FINITELIB)/MultiGrid_3D.h $(FINITELIB)/NonParamElement_3D.h \
	$(FINITELIB)/NumIntegration_3D.h $(FINITELIB)/RotatedElement_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(FINITELIB)/TrilinearElement_3D.h \
	$(COMTOOL)/blist.h $(COMTOOL)/CComTool.h $(COMTOOL)/Const.h \
	$(COMTOOL)/MComTool.h $(SRCDIR)/CCoarseGrid.h $(SRCDIR)/Daten.h \
	$(SRCDIR)/FeatDomainBound.h $(SRCDIR)/ParGrid.h $(SRCDIR)/PostGrid.h \
	$(SRCDIR)/String.h $(SRCDIR)/Task.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/Transform_3D.o: \
	Transform_3D.cc $(FINITELIB)/FiniteElement_3D.h \
	$(FINITELIB)/MultiGrid_3D.h $(FINITELIB)/NumIntegration_3D.h \
	$(FINITELIB)/SquareGrid_3D.h $(TYPICAL_DEP_LIST)

# 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 libparlin libparlin.a clean clean_lib purge
