############################################################################
#
#  Program:  OpenSees
#
#  Purpose:  A Top-level Makefile to create the libraries needed
#            to use the OpenSees framework.
#
#   version created for Redhat 8.0 LINUX distribution
#
#  Written: fmk
#  Created: 01/2003
#
#
############################################################################

# %---------------------------------%
# |  SECTION 1: PROGRAM             |
# %---------------------------------%
#
# Specify the location and name of the OpenSees interpreter program
# that will be created (if this all works
#HOME=/apps/opensees/2.2.2
OpenSees_PROGRAM = $(HOME)/bin/OpenSees
OpenSees_PROGRAM_MPI = $(HOME)/bin/OpenSeesMPI

# %---------------------------------%
# |  SECTION 2: MAKEFILE CONSTANTS  |
# %---------------------------------%
#
# Specify the constants the are used as control structure variables in the Makefiles.

OPERATING_SYSTEM = LINUX
PROGRAMMING_MODE = PARALLEL
RELIABILITY = NO_RELIABILITY
GRAPHICS = NONE
DEBUG_MODE = NO_DEBUG


#PROGRAMMING_MODE = PARALLEL, SEQUENTIAL
#GRAPHICS = NONE, UsingOpenGL
#RELIABILITY = YES_RELIABILITY, NO_RELIABILITY
#DEBUG_MODE = DEBUG, NO_DEBUG


# %---------------------------------%
# |  SECTION 3: PATHS               |
# %---------------------------------%
#
# Note: if vendor supplied BLAS and LAPACK libraries or if you have
# any of the libraries already leave the directory location blank AND
# remove the directory from DIRS.

BASE  = 
#  PUT YOUR HOME DIRECTOREY HERE
#HOME  = /scratch/fmckenna
HOME = /home/hmangala/build
FE    = $(HOME)/OpenSees/SRC

BLASdir      = $(HOME)/OpenSees/OTHER/BLAS
CBLASdir     = $(HOME)/OpenSees/OTHER/CBLAS
LAPACKdir    = $(HOME)/OpenSees/OTHER/LAPACK
ARPACKdir    = $(HOME)/OpenSees/OTHER/ARPACK
UMFPACKdir   = $(HOME)/OpenSees/OTHER/UMFPACK
METISdir     = $(HOME)/OpenSees/OTHER/METIS
SRCdir       = $(HOME)/OpenSees/SRC
SUPERLUdir   = $(HOME)/OpenSees/OTHER/SuperLU_3.0/SRC

SUPERLU_DISTdir   = $(HOME)/OpenSees/OTHER/SuperLU_DIST_2.0/SRC

DIRS        = $(BLASdir) \
              $(CBLASdir) \
              $(SUPERLUdir) \
              $(LAPACKdir) \
              $(ARPACKdir) \
              $(UMFPACKdir) \
              $(METISdir) \
	      $(SUPERLU_DISTdir) \
              $(SRCdir) 

# %-------------------------------------------------------%
# | SECTION 4: LIBRARIES                                  |
# |                                                       |
# | The following section defines the libraries that will |
# | be created and/or linked with when the libraries are  |
# | being created or linked with.                         |
# %-------------------------------------------------------%
#
# Note: if vendor supplied BLAS and LAPACK libraries leave the
# libraries blank. You have to get your own copy of the tcl/tk 
# library!! 
#
# Note: For libraries that will be created (any in DIRS above)
# make sure the directory exsists where you want the library to go!

FE_LIBRARY          = $(HOME)/lib/libOpenSees.a
NDARRAY_LIBRARY     = $(HOME)/lib/libndarray.a  # BJ_UCD jeremic@ucdavis.edu 
MATMOD_LIBRARY      = $(HOME)/lib/libmatmod.a   # BJ_UCD jeremic@ucdavis.edu 
BJMISC_LIBRARY      = $(HOME)/lib/libBJmisc.a  # BJ_UCD jeremic@ucdavis.edu
LAPACK_LIBRARY      = $(HOME)/lib/libLapack.a
BLAS_LIBRARY        = $(HOME)/lib/libBlas.a
SUPERLU_LIBRARY     = $(HOME)/lib/libSuperLU.a
CBLAS_LIBRARY       = $(HOME)/lib/libCBlas.a
ARPACK_LIBRARY      = $(HOME)/lib/libArpack.a
UMFPACK_LIBRARY     = $(HOME)/lib/libUmfpack.a
METIS_LIBRARY       = $(HOME)/lib/libMetis.a
DISTRIBUTED_SUPERLU_LIBRARY     = $(HOME)/lib/libDistributedSuperLU.a

TCL_LIBRARY         = /usr/lib/libtcl8.4.a /usr/lib/libtk8.4.a
#/usr/lib64/libtcl8.4.so /usr/lib64/libtk8.4.so # centos
#/apps/tcl/8.5.5/lib/libtcl8.5.so /apps/tk/8.5.5/lib/libtk8.5.so

ifeq ($(RELIABILITY), YES_RELIABILITY)
RELIABILITY_LIBRARY = $(HOME)/lib/libReliability.a
else
RELIABILITY_LIBRARY = 
endif

# WATCH OUT .. These libraries are removed when 'make wipe' is invoked.

WIPE_LIBS	= $(FE_LIBRARY) \
           $(NDARRAY_LIBRARY) \
           $(MATMOD_LIBRARY) \
	   $(DISTRIBUTED_SUPERLU_LIBRARY) \
           $(SUPERLU_LIBRARY) \
           $(ARPACK_LIBRARY) \
           $(UMFPACK_LIBRARY) \
           $(METIS_LIBRARY) \
           $(LAPACK_LIBRARY) \
           $(BLAS_LIBRARY) \
           $(CBLAS_LIBRARY) \
	   $(RELIABILITY_LIBRARY)

# %---------------------------------------------------------%
# | SECTION 5: COMPILERS                                    |
# |                                                         |
# | The following macros specify compilers, linker/loaders, |
# | the archiver, and their options.  You need to make sure |
# | these are correct for your system.                      |
# %---------------------------------------------------------%

# ################################################### 
# # Compilers
# ################################################### 

CC++            =  /usr/bin/g++
CC              =  /usr/bin/gcc
FC              =  /usr/bin/gfortran
FORTRAN         =  /usr/bin/gfortran
F90             =
LINKER          =  /apps/openmpi/1.4.3/bin/mpicxx 

AR		= ar 
ARFLAGS		= cqls
ARCH		= ar 
ARCHFLAGS		= cqls
RANLIB		= ranlib
RANLIBFLAGS     = 

PROGRAMMING_FLAG = 

ifeq ($(GRAPHICS), UsinOpenGl)
GRAPHIC_FLAG = -D_GLX
GRAPHIC_LIBRARY     = -L/usr/X11/R6/lib -lGL -lGLU 
else
GRAPHIC_FLAG = -D_NOGRAPHICS
GRAPHIC_LIBRARY     =
endif

ifeq ($(RELIABILITY), YES_RELIABILITY)
RELIABILITY_FLAG = -D_RELIABILITY
else
RELIABILITY_FLAG =
endif

ifeq ($(DEBUG_MODE), DEBUG)
DEBUG_FLAG = -D_G3DEBUG 
else
DEBUG_FLAG =
endif

ifeq ($(DEBUG_MODE), DEBUG)

C++FLAGS        = -Wall -g -pg  -D_LINUX -D_UNIX $(GRAPHIC_FLAG) $(RELIABILITY_FLAG) $(DEBUG_FLAG) $(PROGRAMMING_FLAG)  -D_PARALLEL_PROCESSING -D_TCL84
CFLAGS          = -Wall -g -pg -I/apps/openmpi/1.4.3/include $(GRAPHIC_FLAG) $(RELIABILITY_FLAG) $(DEBUG_FLAG) $(PROGRAMMING_FLAG) 
#FFLAGS          = -Wall -L/usr/lib64 -lgfortran  # centos
FFLAGS          = -Wall -L/usr/lib -lgfortran
LINKFLAGS       = -rdynamic -g -pg

else

C++FLAGS        = -Wall -O2  -D_LINUX -D_UNIX -D_TCL84 -Wall $(GRAPHIC_FLAG) $(RELIABILITY_FLAG) $(DEBUG_FLAG) $(PROGRAMMING_FLAG) -D_PARALLEL_PROCESSING -ffloat-store

CFLAGS          = -Wall  $(GRAPHIC_FLAG) $(RELIABILITY_FLAG) $(PROGRAMMING_FLAG) 
#FFLAGS          = -Wall -L/usr/lib64 -lgfortran # Centos
FFLAGS          = -Wall -L/usr/lib -lgfortran
LINKFLAGS       = -rdynamic 

endif

# Misc
MAKE            = make
CD              = cd
ECHO            = echo
RM              = rm
RMFLAGS         = -f
SHELL           = /bin/sh

# %---------------------------------------------------------%
# | SECTION 6: COMPILATION                                  |
# |                                                         |
# | The following macros specify the macros used in         |
# | to compile the source code into object code.            |
# %---------------------------------------------------------%

.SUFFIXES:
.SUFFIXES:	.C .c .f .f90 .cpp .o .cpp

#
# %------------------%
# | Default command. |
# %------------------%
#
.DEFAULT:
	@$(ECHO) "Unknown target $@, try:  make help"
#
# %-----------------------------------------------%
# |  Command to build .o files from source files. |
# %-----------------------------------------------%
#

.cpp.o:
	@$(ECHO) Making $@ from $<
	$(CC++) $(C++FLAGS) $(INCLUDES) -c $< -o $@

.C.o:
	@$(ECHO) Making $@ from $<
	$(CC++) $(C++FLAGS) $(INCLUDES) -c $< -o $@

.c.o:
	@$(ECHO) Making $@ from $<
	$(CC) $(CFLAGS) -c $< 

.f.o:      
	@$(ECHO) Making $@ from $<
	$(FC) $(FFLAGS) -c $< -o $@

.f77.o:      
	@$(ECHO) Making $@ from $<
	$(FC) $(FFLAGS) -c $< -o $@

.f90.o:      
	@$(ECHO) Making $@ from $<
	$(FC90) $(FFLAGS) -c $< -o $@

# %---------------------------------------------------------%
# | SECTION 7: OTHER LIBRARIES                              |
# |                                                         |
# | The following macros specify other libraries that must  |
# | be linked with when creating executables. These are     |
# | platform specific and typically order does matter!!     |
# %---------------------------------------------------------%
MACHINE_LINKLIBS  = -L$(BASE)/lib \
                    -L$(HOME)/lib \
                    -L/usr/lib



MACHINE_NUMERICAL_LIBS  = -lm -lgfortran \
	$(ARPACK_LIBRARY) \
	$(DISTRIBUTED_SUPERLU_LIBRARY) \
	$(SUPERLU_LIBRARY) \
	$(UMFPACK_LIBRARY) \
	$(LAPACK_LIBRARY)  \
	$(BLAS_LIBRARY) \
	$(CBLAS_LIBRARY) \
	$(GRAPHIC_LIBRARY)\
	$(METIS_LIBRARY)\
	$(RELIABILITY_LIBRARY)\
	$(PETSC_LIB)\
   -ldl
#	-lg2c -ldl

MPICC = mpicc
MPIINC = -I/apps/openmpi/1.4.3/include/
MPILIB = -L/apps/openmpi/1.4.3/lib -lmpi

PETSC_INC = -I/apps/petsc/3.1-p8/include

#-I/scratch/fmckenna/petsc-2.2.1 \
#	-I/scratch/fmckenna/petsc-2.2.1/bmake/linux-gnu \
#	-I/scratch/fmckenna/petsc-2.2.1/include \
#        -I/scratch/fmckenna/petsc-2.2.1/include/mpiuni \
#	-DPETSC_USE_BOPT_g -DPETSC_USE_EXTERN_CXX


PETSCINC = /apps/petsc/3.1-p8/include
#-I/scratch/fmckenna/OpenSees/SRC/system_of_eqn/linear/petsc/petsc-2.2.1 -I/scratch/fmckenna/OpenSees/SRC/system_of_eqn/linear/petsc/petsc-2.2.1/bmake/linux-gnu -I/scratch/fmckenna/OpenSees/SRC/system_of_eqn/linear/petsc/petsc-2.2.1/include \
#	-I/scratch/fmckenna/petsc-2.2.1/include/mpiuni -DPETSC_USE_BOPT_g -DPETSC_USE_EXTERN_CXX
	
#PETSCINC = -I/scratch/fmckenna/petsc-2.2.1/include -D_PETSC  -I/scratch/fmckenna/petsc-2.2.1/bmake/linux-gnu -DPETSC_USE_BOPT_g -DPETSC_USE_EXTERN_CXX


#	$(FE)/system_of_eqn/linearSOE/petsc/PetscSparseSeqSolver.o \


PETSC_LIB = /apps/petsc/3.1-p8/lib/libpetsc.a	

#$(FE)/system_of_eqn/linearSOE/petsc/PetscSOE.o \
#	$(FE)/system_of_eqn/linearSOE/petsc/PetscSolver.o \
#	$(FE)/system_of_eqn/linearSOE/petsc/PetscSparseSeqSolver.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dgebak.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dgebal.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dgeev.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dgehd2.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dgehrd.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dhseqr.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dlahrd.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dorg2r.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dorghr.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dorgqr.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dpotrf.o \
	$(HOME)/OpenSees/OTHER/LAPACK/dpotrs.o \

#	-L/scratch/fmckenna/petsc-2.2.1/lib/libg/linux-gnu/
#	-lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetsc 

ifeq ($(PROGRAMMING_MODE), THREADS)
MACHINE_SPECIFIC_LIBS = -lpthread
else
MACHINE_SPECIFIC_LIBS = -ldl  -lieee -lm -lc  -Wl,-rpath,/usr/lib -lpng $(MPILIB) 
endif


# %---------------------------------------------------------%
# | SECTION 8: INCLUDE FILES                                |
# |                                                         |
# | The following macros specify include files needed for   |
# | compilation.                                            |
# %---------------------------------------------------------%


MACHINE_INCLUDES        = $(MPIINC) \
			  -I/usr/local/BerkeleyDB.4.0/include \
                          -I/usr/include/mysql \
                          -I$(HOME)/include   \
	                  -I$(UMFPACKdir) \
                          -I$(SUPERLUdir) \
                          -I$(SUPERLU_DISTdir) $(PETSCINC)


# this file contains all the OpenSees/SRC includes
include $(FE)/Makefile.incl

TCL_INCLUDES = -I/usr/include/tcl8.4

INCLUDES =  $(MACHINE_INCLUDES)   $(TCL_INCLUDES) $(FE_INCLUDES)
