# This is the makefile for the mesa matrix library (a subset of lapack)

MESA_DIR = ../..

#################################################################

# STEP 1: set up the standard info

include $(MESA_DIR)/utils/makefile_header


#################################################################

# STEP 2: build

LIB = libmtx.a


ifeq ($(WHICH_LAPACK),USE_SRCS)

LAPACK_OBJS = \
   dgbcon.o dgbequ.o dgbrfs.o dgbsv.o dgbsvx.o dgbtf2.o dgbtrf.o dgbtrs.o \
   dgecon.o dgeequ.o dgerfs.o dgesv.o dgesvx.o dgetf2.o dgetrf.o dgetrs.o \
   dgtcon.o dgtrfs.o dgtsv.o dgtsvx.o dgttrf.o dgttrs.o dgtts2.o dlacn2.o \
   dlabad.o dlacn2.o dlacpy.o dlagtm.o dlangb.o dlange.o dlangt.o dlantb.o \
   dlantr.o dlaqgb.o dlaqge.o dlassq.o dlaswp.o dlatbs.o dlatrs.o drscl.o \
   dgetri.o dgesvd.o dnrm2.o \
   dbdsqr.o	dgelqf.o	dlascl.o	dorgbr.o	dorgqr.o	dtrtri.o \
   dgebrd.o	dgeqrf.o	dlaset.o	dorglq.o	dormbr.o \
   dgebd2.o	dgeqr2.o	dlarfb.o	dlartg.o	dlasq1.o	dlasv2.o	dorgl2.o	dormqr.o	dtrmm.o \
   dgelq2.o	dlabrd.o	dlarft.o	dlas2.o	dlasr.o	dorg2r.o	dormlq.o	drot.o dtrti2.o \
   dlarf.o	dlarfg.o	dlasrt.o	dorm2r.o	dorml2.o \
   dlapy2.o	dlasq2.o	dtrmv.o dlazq3.o \
   dlasq5.o	dlasq6.o	dlazq4.o \
   sgesv.o sgetf2.o sgetrf.o sgetrs.o slaswp.o \
   zgbtrf.o zgbtrs.o zgetrf.o zgetrs.o zgetf2.o zlaswp.o zlacgv.o \
   zswap.o zgeru.o ztbsv.o zgemv.o ztrsm.o zgbtf2.o izamax.o \
   zgttrf.o zgttrs.o zgtts2.o \
   zscal.o zcopy.o zgemm.o dcabs1.o ilaenv.o dlamch.o ieeeck.o


LAPACK_LIB = libmesalapack.a
	
endif


LAPACK_QUAD_OBJS = \
   qgttrf.o qgttrs.o qgtts2.o qgetrf.o qgetrs.o qgemv.o qgemm.o qgetf2.o \
   qswap.o iqamax.o qtrsm.o qger.o qscal.o qlamch.o qlaswp.o \


ifeq ($(WHICH_BLAS),USE_SRCS)

BLAS_OBJS = \
   dgemm.o dtrsm.o xerbla.o lsame.o dger.o \
   dcopy.o dgemv.o dtbsv.o daxpy.o ddot.o dgbmv.o dasum.o \
   dtrsv.o dscal.o dswap.o idamax.o \
   strsm.o sgemm.o slamch.o isamax.o \
   sswap.o sscal.o sger.o \
   zaxpy.o zdotc.o zgerc.o zhemv.o zher2.o ztrsv.o

BLAS_LIB = libmesablas.a

endif


ifeq ($(USE_MKL_PARDISO),YES)
MKL_PARDISO_OBJ = mod_mkl_pardiso.o
else
MKL_PARDISO_OBJ = mod_mkl_pardiso_stub.o
endif

# AMD
AMD_OBJS = amd_aat.o amd_1.o amd_2.o amd_postorder.o amd_post_tree.o amd_defaults.o \
	amd_order.o amd_control.o amd_info.o amd_valid.o amd_preprocess.o amd_global.o

# BTF
BTF_OBJS = btf_order.o btf_maxtrans.o btf_strongcomp.o

# COLAMD
COLAMD_OBJS = colamd_global.o colamd.o

# KLU
KLU_D_OBJS = klu_d.o klu_d_kernel.o \
    klu_d_factor.o klu_d_free_numeric.o klu_d_solve.o \
    klu_d_scale.o klu_d_refactor.o \
    klu_d_tsolve.o klu_d_diagnostics.o klu_d_sort.o klu_d_extract.o \
    klu_c_fortran.o
KLU_COMMON_OBJS = \
    klu_free_symbolic.o klu_defaults.o klu_analyze_given.o \
    klu_analyze.o klu_memory.o

KLU_OBJS = $(BTF_OBJS) $(COLAMD_OBJS) $(AMD_OBJS) $(KLU_COMMON_OBJS) $(KLU_D_OBJS) 

KLU_LIB = libmesaklu.a

KLU_DIR = $(MODULE_DIR)/klu_src
KLU_C = $(CC) -O3 -fno-common -fexceptions
KLU_I = -I$(KLU_DIR)


MTX_OBJS = \
   my_lapack95_dble.o my_lapack95_quad.o \
   mtx_support.o mod_klu.o \
   thomas_block_dble.o thomas_block_quad.o thomas_block_sparse.o \
   d_and_c_block_dble.o d_and_c_block_quad.o \
   d_and_c_block_sparse_dble.o

LIB_OBJS = \
   mtx_def.o $(MKL_PARDISO_OBJ) $(MTX_OBJS) \
   $(LAPACK_QUAD_OBJS) mtx_lib.o


all : $(LIB) $(BLAS_LIB) $(LAPACK_LIB) $(KLU_LIB)


$(LIB) : $(LIB_OBJS)
	$(LIB_TOOL) $(LIB) $(LIB_OBJS)

ifeq ($(WHICH_LAPACK),USE_SRCS)
$(LAPACK_LIB) : $(LAPACK_OBJS)
	$(LIB_TOOL) $(LAPACK_LIB) $(LAPACK_OBJS)	
endif

ifeq ($(WHICH_BLAS),USE_SRCS)
$(BLAS_LIB) : $(BLAS_OBJS)
	$(LIB_TOOL) $(BLAS_LIB) $(BLAS_OBJS)
endif

$(KLU_LIB) : $(KLU_OBJS)
	$(LIB_TOOL) $(KLU_LIB) $(KLU_OBJS)	


#################################################################

#COMPILE = $(COMPILE_TO_TEST) $(FCfixed)
COMPILE = $(COMPILE_TO_DEPLOY) $(FCfixed)
#COMPILE_FREE = $(COMPILE_TO_TEST) $(FCfree)
COMPILE_FREE = $(COMPILE_TO_DEPLOY) $(FCfree)

#COMPILE_FREE = $(COMPILE_TO_DEPLOY) $(FCfree) $(FCwarn_unused)

COMPILE_XTRA = $(COMPILE_BASIC) $(FCwarn) $(FCimpno) $(FCopt) -c $(FCfixed)
COMPILE_XTRA_TEST = $(COMPILE_BASIC) $(FCwarn) $(FCimpno) $(FCopt) $(FCchecks) -g -c $(FCfixed)
COMPILE_XTRA_FREE = $(COMPILE_BASIC) $(FCwarn) $(FCimpno) $(FCopt) -c $(FCfree)
COMPILE_XTRA_NO_OPT = $(COMPILE_BASIC) $(FCnowarn) $(FCfixed) -c

mtx_lib.o: \
   $(MOD_PUBLIC_DIR)/mtx_lib.f \
   $(MOD_PUBLIC_DIR)/mtx_dble_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_klu_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_mkl_pardiso_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_null_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_debug_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_formats.dek \
   $(MOD_PUBLIC_DIR)/mtx_tridiag_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_thomas_dble_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_thomas_quad_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_dc_mt_dble_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_dc_mt_quad_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_dc_mt_klu_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_block_thomas_klu_decsol.dek \
   $(MOD_PUBLIC_DIR)/mtx_jac.dek \
   $(MOD_PUBLIC_DIR)/mtx_rcond.dek
	$(COMPILE_FREE) $<

%.o: $(MOD_PUBLIC_DIR)/%.f
	$(COMPILE) $<

mtx_support.o: $(MOD_PRIVATE_DIR)/mtx_support.f
	$(COMPILE_FREE) $<

my_lapack95_dble.o: $(MOD_PRIVATE_DIR)/my_lapack95.f
	$(COMPILE_FREE) $(FC_free_preprocess) -DDBLE -o my_lapack95_dble.o $<
my_lapack95_quad.o: $(MOD_PRIVATE_DIR)/my_lapack95.f
	$(COMPILE_FREE) $(FC_free_preprocess) -o my_lapack95_quad.o $<

thomas_block_dble.o: $(MOD_PRIVATE_DIR)/thomas_block.f
	$(COMPILE_FREE) $(FC_free_preprocess) -DDBLE -o thomas_block_dble.o $<
thomas_block_quad.o: $(MOD_PRIVATE_DIR)/thomas_block.f
	$(COMPILE_FREE) $(FC_free_preprocess) -o thomas_block_quad.o $<

thomas_block_sparse.o: $(MOD_PRIVATE_DIR)/thomas_block_sparse.f
	$(COMPILE_FREE) $<

d_and_c_block_dble.o: $(MOD_PRIVATE_DIR)/d_and_c_block.f
	$(COMPILE_FREE) $(FC_free_preprocess) -DDBLE -o d_and_c_block_dble.o $<
d_and_c_block_quad.o: $(MOD_PRIVATE_DIR)/d_and_c_block.f
	$(COMPILE_FREE) $(FC_free_preprocess) -o d_and_c_block_quad.o $<

d_and_c_block_sparse_dble.o: $(MOD_PRIVATE_DIR)/d_and_c_block_sparse.f
	$(COMPILE_FREE) $(FC_free_preprocess) -DDBLE -o d_and_c_block_sparse_dble.o $<

d_and_c_block_klu.o: $(MOD_PRIVATE_DIR)/d_and_c_block_klu.f
	$(COMPILE_FREE) $<

%.o: $(MOD_PRIVATE_DIR)/%.f
	$(COMPILE) $<

%.o: $(MODULE_DIR)/lapack_src/%.f
	$(COMPILE_XTRA) -w $<

# must turn off optimization for dlamch or can get infinite loop!!!
dlamch.o: $(MODULE_DIR)/blas_src/dlamch.f
	$(COMPILE_XTRA_NO_OPT) -w $<

%.o: $(filter-out $(MODULE_DIR)/blas_src/dlamch.f, \
	$(MODULE_DIR)/blas_src/%.f)
	$(COMPILE_XTRA) -w $<

%.o: $(MODULE_DIR)/mkl_pardiso_src/%.f
	$(COMPILE_XTRA) -w $<



%.o: $(MODULE_DIR)/lapack_quad/%.f
	$(COMPILE_XTRA) -w $<


#-------------------------------------------------------------------------------

amd_global.o: $(KLU_DIR)/amd_global.c
	$(KLU_C) -c $(KLU_I) $< -o $@

amd_%.o: $(KLU_DIR)/amd_%.c
	$(KLU_C) -c $(KLU_I) -DDINT $< -o $@

#-------------------------------------------------------------------------------

btf_order.o: $(KLU_DIR)/btf_order.c
	$(KLU_C) -c $(KLU_I) $< -o $@

btf_maxtrans.o: $(KLU_DIR)/btf_maxtrans.c
	$(KLU_C) -c $(KLU_I) $< -o $@

btf_strongcomp.o: $(KLU_DIR)/btf_strongcomp.c
	$(KLU_C) -c $(KLU_I) $< -o $@

#-------------------------------------------------------------------------------

colamd_global.o: $(KLU_DIR)/colamd_global.c
	$(KLU_C) -c $(KLU_I) $< -o $@

colamd.o: $(KLU_DIR)/colamd.c
	$(KLU_C) -c $(KLU_I) $< -o $@

colamd_l.o: $(KLU_DIR)/colamd.c
	$(KLU_C) -c $(KLU_I) $< -DDLONG -o $@

#-------------------------------------------------------------------------------

klu_d.o: $(KLU_DIR)/klu.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_kernel.o: $(KLU_DIR)/klu_kernel.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_sort.o: $(KLU_DIR)/klu_sort.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_diagnostics.o: $(KLU_DIR)/klu_diagnostics.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_factor.o: $(KLU_DIR)/klu_factor.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_free_numeric.o: $(KLU_DIR)/klu_free_numeric.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_extract.o: $(KLU_DIR)/klu_extract.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_refactor.o: $(KLU_DIR)/klu_refactor.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_scale.o: $(KLU_DIR)/klu_scale.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_solve.o: $(KLU_DIR)/klu_solve.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_d_tsolve.o: $(KLU_DIR)/klu_tsolve.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_c_fortran.o: $(KLU_DIR)/klu_c_fortran.c
	$(KLU_C) -c $(KLU_I) $< -o $@

#-------------------------------------------------------------------------------

klu_analyze.o: $(KLU_DIR)/klu_analyze.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_analyze_given.o: $(KLU_DIR)/klu_analyze_given.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_defaults.o: $(KLU_DIR)/klu_defaults.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_free_symbolic.o: $(KLU_DIR)/klu_free_symbolic.c
	$(KLU_C) -c $(KLU_I) $< -o $@

klu_memory.o: $(KLU_DIR)/klu_memory.c
	$(KLU_C) -c $(KLU_I) $< -o $@

#-------------------------------------------------------------------------------



clean:
	-@rm -f *.o *.mod *genmod.f90 $(LIB) $(BLAS_LIB) $(LAPACK_LIB) $(KLU_LIB)
