#!/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 finite element library, Version 2.0                  #
#                                                                   #
#####################################################################

# Location of parpp3d++
SRCDIR   = ..

include $(SRCDIR)/Makefile.inc

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

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


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

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

lib:            $(OBJDIR)/libfinite.a

libfinite:      $(OBJDIR)/libfinite.a

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

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

clean:          clean_lib

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

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

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

$(OBJDIR)/AdjustGridInfo_3D.o: \
	AdjustGridInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CalcParam_3D.o: \
	CalcParam_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/ConstantElement_3D.o: \
	ConstantElement_3D.cc ConstantElement_3D.h FiniteElement_3D.h \
	NumIntegration_3D.h SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateBoundCoord_3D.o: \
	CreateBoundCoord_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateEdgeInfo_3D.o: \
	CreateEdgeInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateElemMeetEdgeInfo_3D.o: \
	CreateElemMeetEdgeInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateElemMeetFaceInfo_3D.o: \
	CreateElemMeetFaceInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateFaceInfo_3D.o: \
	CreateFaceInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateNeighInfo_3D.o: \
	CreateNeighInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

$(OBJDIR)/CreateVertexInfo_3D.o: \
	CreateVertexInfo_3D.cc SquareGrid_3D.h $(SRCDIR)/cinput.h \
	$(TYPICAL_DEP_LIST)

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

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

$(OBJDIR)/NonParamElement_3D.o: \
	NonParamElement_3D.cc FiniteElement_3D.h NonParamElement_3D.h \
	NumIntegration_3D.h SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/NumIntegration_3D.o: \
	NumIntegration_3D.cc NumIntegration_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/ParmProc_3D.o: \
	ParmProc_3D.cc SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/PrintArray_3D.o: \
	PrintArray_3D.cc SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/Refine_3D.o: \
	Refine_3D.cc SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/RotatedElement_3D.o: \
	RotatedElement_3D.cc FiniteElement_3D.h NumIntegration_3D.h \
	RotatedElement_3D.h SquareGrid_3D.h $(TYPICAL_DEP_LIST)

$(OBJDIR)/SquareGrid_3D.o: \
	SquareGrid_3D.cc SquareGrid_3D.h $(TYPICAL_DEP_LIST)

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

$(OBJDIR)/TrilinearElement_3D.o: \
	TrilinearElement_3D.cc FiniteElement_3D.h NumIntegration_3D.h \
	SquareGrid_3D.h TrilinearElement_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 libfinite libfinite.a clean clean_lib purge
