SHELL = /bin/sh

# ============================================================================
# ===== flags and directories (to be modified by the user) ===================
# ============================================================================

USE_PARALLEL_AMDIS = 0      # 1 if AMDiS was compiled with parallel support, 0 otherwise
USE_OPENMP = 0              # 1 if AMDiS was compiled with OpenMP support, 0 otherwise
USE_UMFPACK = 0             # 1 if AMDiS was compiled with UMFPACK library, 0 otherwise
USE_MKL = 0                 # 1 if AMDiS was compiled with Intel MKL library, 0 otherwise
USE_BOOST = 0               # 1 if AMDiS was compiled with Boost support, 0 otherwise
USE_SERVER =                # mars, deimos or themisto. If no special server blank
USE_COMPILER = gcc          # gcc  or icc
USE_SMI = 0
USE_MPCCI = 0
DEBUG = 0

AMDIS_DIR = ../AMDiS
MPI_DIR =                   # on mars, deimos or themisto, leave this field blank
BOOST_DIR =                 # if compiled with boost support, define here the boost directory
SMI_DIR = 
MPCCI_DIR = 





# ============================================================================
#                 !!! Do not edit after this line !!!
# ============================================================================





PARMETIS_DIR = $(AMDIS_DIR)/lib/ParMetis-3.1

# ============================================================================
# ===== includes pathes ======================================================
# ============================================================================

AMDIS_INCLUDE = -I$(AMDIS_DIR)/src -I$(AMDIS_DIR)/compositeFEM/src -I$(AMDIS_DIR)/lib/mtl4
SMI_INCLUDE = -I$(SMI_DIR)/smi 
MPCCI_INCLUDE = -I$(MPCCI_DIR)/include
PARMETIS_INCLUDE = -I$(PARMETIS_DIR)
PARALLEL_INCLUDE = -I$(AMDIS_DIR)/src/parallel

INCLUDES = -I. $(AMDIS_INCLUDE) $(SMI_INCLUDE) $(MPCCI_INCLUDE) -I$(SMI_DIR)/etc/commoncpp/include $(PARALLEL_INCLUDE)

# ============================================================================
# ===== libraries ============================================================
# ============================================================================

AMDIS_LIB =  -L$(AMDIS_DIR)/lib -lamdis
PNG_LIB = -lpng

UMFPACK_LIB = -L$(AMDIS_DIR)/lib/AMD/Lib -L$(AMDIS_DIR)/lib/UMFPACK/Lib
ifeq ($(strip $(USE_SERVER)), mars)
	UMFPACK_LIB += -lmkl -lumfpack -lamd
else
	ifeq ($(strip $(USE_SERVER)), themisto)
		UMFPACK_LIB += $(MKL_LIB) -lmkl -lguide -lpthread -lumfpack -lamd
	else	
		ifeq ($(strip $(USE_SERVER)), deimos)
			MPI_DIR = /licsoft/libraries/openmpi/1.2.6/64bit
			UMFPACK_LIB += -lumfpack -lamd -L/licsoft/libraries/goto -lgoto -lpthread
		else
			UMFPACK_LIB += -lblas -lumfpack -lamd
		endif
	endif
endif

SMI_LIB = -L$(SMI_DIR)/lib -lsmi
MPCCI_LIB = -L$(MPCCI_DIR)/lib/linux-x86-glibc22 -lmpcci
PARMETIS_LIB = -L$(PARMETIS_DIR) -lparmetis -lmetis

LIBS = $(AMDIS_LIB) $(PNG_LIB)

ifeq ($(strip $(USE_UMFPACK)), 1)
	LIBS += $(UMFPACK_LIB)
endif

ifeq ($(strip $(USE_MKL)), 1)
	ifeq ($(strip $(USE_SERVER)), themisto)
		LIBS += $(MKL_LIB) 
	else
		LIBS += -L$(MKL_LIB) 
	endif

	LIBS += -lmkl -lmkl_solver -lguide -lpthread
endif

ifeq ($(strip $(USE_SMI)), 1)
	LIBS += $(SMI_LIB) 
endif

ifeq ($(strip $(USE_MPCCI)), 1)
	LIBS += $(MPCCI_LIB) 
endif

ifeq ($(strip $(USE_BOOST)), 1)
	LIBS += -L$(BOOST_DIR)/lib -lboost_iostreams
endif


# ============================================================================
# ===== parallel or sequential ? =============================================
# ============================================================================

ifeq ($(strip $(USE_PARALLEL_AMDIS)), 1)
	ifeq ($(strip $(USE_SERVER)), mars)
		ifeq ($(strip $(USE_COMPILER)), gcc)
			COMPILE = g++
		else
			COMPILE = icpc
		endif
	else
		COMPILE = $(MPI_DIR)/bin/mpiCC
	endif

	LIBS += $(PARMETIS_LIB) -lmpi
else
	ifeq ($(strip $(USE_COMPILER)), gcc)
		COMPILE = g++
	else
		COMPILE = icpc
	endif
endif

# ============================================================================
# ===== compile flags ========================================================
# ============================================================================

ifeq ($(strip $(DEBUG)), 0)
       CPPFLAGS = -O2
else
       CPPFLAGS = -g -O0
endif

ifeq ($(strip $(USE_OPENMP)), 1)
	ifeq ($(strip $(USE_COMPILER)), gcc)
		CPPFLAGS += -fopenmp
	else
		CPPFLAGS += -openmp
	endif
endif


# ============================================================================
# ===== libtool linking ======================================================
# ============================================================================

LIBTOOL = $(AMDIS_DIR)/libtool
LINK = $(LIBTOOL) --mode=link $(COMPILE)

# ============================================================================
# ===== rules ================================================================
# ============================================================================

all : 
	make $(PROGRAMS)

clean: 
	-rm -rf *.o
	-rm -rf $(PROGRAMS)

.cc.o: $*.cc
	$(COMPILE) $(DEFS) $(INCLUDES) $(CPPFLAGS) -c -o $*.o $^ 


# ============================================================================
# ===== user programs ========================================================
# ============================================================================

PROGRAMS = ellipt nonlin heat vecellipt vecnonlin vecheat sphere ball smitest parametric torus bunny navierstokes stokesnonlin vecmultigrid

VPATH = .:./src:/solhome/vey/sourcen/currentcvs/AMDiS/src

# ===== ellipt ============================================================

ELLIPT_OFILES = ellipt.o

ellipt: $(ELLIPT_OFILES)
	$(LINK) $(CPPFLAGS) -o ellipt $(ELLIPT_OFILES) $(LIBS)

# ===== nonlin ============================================================

NONLIN_OFILES = nonlin.o

nonlin: $(NONLIN_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o nonlin $(NONLIN_OFILES) $(LIBS)

# ===== heat ============================================================

HEAT_OFILES = heat.o

heat: 	$(HEAT_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o heat $(HEAT_OFILES) $(LIBS)

# ===== vecellipt ============================================================

VECELLIPT_OFILES = vecellipt.o

vecellipt: $(VECELLIPT_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o vecellipt $(VECELLIPT_OFILES) $(LIBS)

# ===== vecnonlin ============================================================

VECNONLIN_OFILES = vecnonlin.o

vecnonlin: $(VECNONLIN_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o vecnonlin $(VECNONLIN_OFILES) $(LIBS)

# ===== vecheat ============================================================

VECHEAT_OFILES = vecheat.o

vecheat: $(VECHEAT_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o vecheat $(VECHEAT_OFILES)  $(LIBS)

# ===== vecmultigrid ============================================================

VECMULTIGRID_OFILES = vecmultigrid.o

vecmultigrid: $(VECMULTIGRID_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o vecmultigrid $(VECMULTIGRID_OFILES) $(LIBS)

# ===== sphere ============================================================

SPHERE_OFILES = sphere.o

sphere: $(SPHERE_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o sphere $(SPHERE_OFILES) $(LIBS)

# ===== bunny ============================================================

BUNNY_OFILES = bunny.o

bunny: $(BUNNY_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o bunny $(BUNNY_OFILES) $(LIBS)

# ===== torus ============================================================

TORUS_OFILES = torus.o

torus: $(TORUS_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o torus $(TORUS_OFILES) $(AMDIS_LIB) $(LIBS)

# ===== ball ============================================================

BALL_OFILES = ball.o

ball: $(BALL_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o ball $(BALL_OFILES) $(LIBS)

# ===== parametric ============================================================

PARAMETRIC_OFILES = parametric.o

parametric: $(PARAMETRIC_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o parametric $(PARAMETRIC_OFILES) $(LIBS)

# ===== navierstokes ========================================================

NAVIERSTOKES_OFILES = navierstokes.o

navierstokes: $(NAVIERSTOKES_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o navierstokes $(NAVIERSTOKES_OFILES)  $(LIBS)

# ===== stokes non linear========================================================

STOKESNONLIN_OFILES = stokesnonlin.o

stokesnonlin: $(STOKESNONLIN_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o stokesnonlin $(STOKESNONLIN_OFILES)  $(LIBS)

# ===== smitest ============================================================

SMITEST_OFILES = smitest.o

smitest: $(SMITEST_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o smitest $(INCLUDES) $(SMITEST_OFILES) $(SMI_LIB)

# ===== mpccitest ============================================================

MPCCITEST_OFILES = mpccitest.o SMIAdapter.o MpCCIAdapter.o

mpccitest: $(MPCCITEST_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o mpccitest $(INCLUDES) $(MPCCITEST_OFILES) $(LIBS) $(MPCCI_LIB) $(SMI_LIB)

# ===== mpcci1 ============================================================

MPCCI1_OFILES = mpcci1.o SMIAdapter.o MpCCIAdapter.o

mpcci1: $(MPCCI1_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o mpcci1 $(INCLUDES) $(MPCCI1_OFILES) $(LIBS) $(MPCCI_LIB) $(SMI_LIB)

# ===== mpcci2 ============================================================

MPCCI2_OFILES = mpcci2.o SMIAdapter.o MpCCIAdapter.o

mpcci2: $(MPCCI2_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o mpcci2 $(INCLUDES) $(MPCCI2_OFILES) $(LIBS) $(MPCCI_LIB) $(SMI_LIB)

# ===== periodic ============================================================

PERIODIC_OFILES = periodic.o

periodic: $(PERIODIC_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o periodic $(INCLUDES) $(PERIODIC_OFILES) $(LIBS)

# ===== multigrid ============================================================

MULTIGRID_OFILES = multigrid.o

multigrid: $(MULTIGRID_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o multigrid $(INCLUDES) $(MULTIGRID_OFILES) $(LIBS)

# ===== bmp2amdis ============================================================

BMP2AMDIS_OFILES = bmp2amdis.o EasyBMP.o

bmp2amdis: $(BMP2AMDIS_OFILES)
	$(LINK) $(CPPFLAGS) $(LDFLAGS) -o bmp2amdis $(INCLUDES) $(BMP2AMDIS_OFILES) $(LIBS)

# ===== parallelellipt =======================================================

PARALLELELLIPT_OFILES = parallelellipt.o

parallelellipt: $(PARALLELELLIPT_OFILES)
	$(LINK) $(CPPFLAGS) -o parallelellipt $(PARALLELELLIPT_OFILES) $(LIBS) $(PARMETIS_LIB)

# ===== parallelheat =======================================================

PARALLELHEAT_OFILES = parallelheat.o

parallelheat: $(PARALLELHEAT_OFILES)
	$(LINK) $(CPPFLAGS) -o parallelheat $(PARALLELHEAT_OFILES) $(LIBS) $(PARMETIS_LIB)

# ===== couple ============================================================

COUPLE_OFILES = couple.o

couple: $(COUPLE_OFILES)
	$(LINK) $(CPPFLAGS) -o couple $(COUPLE_OFILES) $(LIBS)

# ===== nonlin2 ============================================================

NONLIN3_OFILES = nonlin3.o

nonlin3: $(NONLIN3_OFILES)
	$(LINK) $(CPPFLAGS) -o nonlin3 $(NONLIN3_OFILES) $(LIBS)

# ===== neumann ============================================================

NEUMANN_OFILES = neumann.o

neumann: $(NEUMANN_OFILES)
	$(LINK) $(CPPFLAGS) -o neumann $(NEUMANN_OFILES) $(LIBS)