SYSHOME := $(shell cd ../..; /bin/pwd)
include $(SYSHOME)/src/Rules.make


############################################################
EXEC   = $(ANIBIN)/TestLU.exe
LIBLU  = $(ANILIB)/liblu.a
LIBS   = $(LIBLU)  -lblas
AMD    = $(SYSHOME)/src/aniLU/AMD
UMFPACK= $(SYSHOME)/src/aniLU/UMFPACK

OPT = -O

CC = cc
CFLAGS = -c  $(OPT)  

F77 = f77
FFLAGS = -c  $(OPT)  

LD = f77
LFLAGS = $(OPT) 

.c.o :
	$(CC) $(CFLAGS) $*.c -o $*.o
.f.o :
	$(F77) $(FFLAGS) $*.f -o $*.o

all:    help

help:
	    @echo "make {lib|clean|purge|help}"
	    @echo " "
	    @echo " Library option:"
	    @echo "     lib    - make library liblu.a"
	    @echo " "
	    @echo " "
	    @echo " Misceleneous options:"
	    @echo "     clean  - clean this directory and bin"
	    @echo "     purge  - clean the packages AMD, UMFPACK and liblu.a"
	    @echo "     help   - print this message"
	    @echo " "
clean :
	rm -rf *.o  $(EXEC) 
purge :
	rm -rf *.o  $(EXEC)  $(LIBLU) $(AMD)/Source/*.o $(UMFPACK)/Source/*.o
lib:
	( cd $(AMD)/Source ; make ; rm -f $(AMD)/Lib/*.a )
	( cd $(UMFPACK)/Source ; make ; rm -f $(UMFPACK)/Lib/*.a )
	( cd $(UMFPACK)/Demo ; $(CC) $(CFLAGS) -I$(UMFPACK)/Include/ umf4_f77wrapper.c -o umf4_f77wrapper.o )
	( rm -f $(LIBLU) )
	( ar -r $(LIBLU) $(UMFPACK)/Demo/umf4_f77wrapper.o )
	( cd $(AMD)/Source ;  ar -r $(LIBLU) \
	    amd_i_aat.o amd_i_1.o amd_i_2.o amd_i_dump.o \
	    amd_i_postorder.o amd_i_post_tree.o amd_i_defaults.o amd_i_order.o \
	    amd_i_control.o amd_i_info.o amd_i_valid.o amd_l_aat.o amd_l_1.o \
	    amd_l_2.o amd_l_dump.o amd_l_postorder.o amd_l_post_tree.o \
	    amd_l_defaults.o amd_l_order.o amd_l_control.o amd_l_info.o \
	    amd_l_valid.o )
	( cd $(UMFPACK)/Source ;  ar -r $(LIBLU) \
	    umf_i_analyze.o umf_i_apply_order.o umf_i_colamd.o umf_i_free.o \
	    umf_i_fsize.o umf_i_is_permutation.o umf_i_malloc.o umf_i_realloc.o \
	    umf_i_report_perm.o umf_i_singletons.o \
	    umf_l_analyze.o umf_l_apply_order.o umf_l_colamd.o umf_l_free.o \
	    umf_l_fsize.o umf_l_is_permutation.o umf_l_malloc.o umf_l_realloc.o \
	    umf_l_report_perm.o umf_l_singletons.o \
	    umfpack_gn_timer.o umfpack_gn_tictoc.o \
	    umf_di_lhsolve.o \
	    umf_di_uhsolve.o umf_di_triplet_map_nox.o umf_di_triplet_nomap_x.o \
	    umf_di_triplet_nomap_nox.o umf_di_triplet_map_x.o \
	    umf_di_assemble_fixq.o umf_di_assemble.o \
	    umf_di_blas3_update.o umf_di_build_tuples.o \
	    umf_di_create_element.o umf_di_dump.o umf_di_extend_front.o \
	    umf_di_garbage_collection.o umf_di_get_memory.o \
	    umf_di_init_front.o umf_di_kernel.o umf_di_kernel_init.o \
	    umf_di_kernel_wrapup.o umf_di_local_search.o umf_di_lsolve.o \
	    umf_di_ltsolve.o umf_di_mem_alloc_element.o \
	    umf_di_mem_alloc_head_block.o umf_di_mem_alloc_tail_block.o \
	    umf_di_mem_free_tail_block.o umf_di_mem_init_memoryspace.o \
	    umf_di_report_vector.o umf_di_row_search.o umf_di_scale_column.o \
	    umf_di_set_stats.o umf_di_solve.o umf_di_symbolic_usage.o \
	    umf_di_transpose.o umf_di_tuple_lengths.o umf_di_usolve.o \
	    umf_di_utsolve.o umf_di_valid_numeric.o umf_di_valid_symbolic.o \
	    umf_di_grow_front.o umf_di_start_front.o umf_di_2by2.o \
	    umf_di_store_lu.o umf_di_scale.o umfpack_di_wsolve.o \
	    umfpack_di_col_to_triplet.o umfpack_di_defaults.o \
	    umfpack_di_free_numeric.o umfpack_di_free_symbolic.o \
	    umfpack_di_get_numeric.o umfpack_di_get_lunz.o \
	    umfpack_di_get_symbolic.o umfpack_di_numeric.o \
	    umfpack_di_qsymbolic.o umfpack_di_report_control.o \
	    umfpack_di_report_info.o umfpack_di_report_matrix.o \
	    umfpack_di_report_numeric.o umfpack_di_report_perm.o \
	    umfpack_di_report_status.o umfpack_di_report_symbolic.o \
	    umfpack_di_report_triplet.o umfpack_di_report_vector.o \
	    umfpack_di_solve.o umfpack_di_symbolic.o umfpack_di_transpose.o \
	    umfpack_di_triplet_to_col.o umfpack_di_scale.o \
	    umfpack_di_load_numeric.o umfpack_di_save_numeric.o \
	    umfpack_di_load_symbolic.o umfpack_di_save_symbolic.o \
	    umf_dl_lhsolve.o \
	    umf_dl_uhsolve.o umf_dl_triplet_map_nox.o umf_dl_triplet_nomap_x.o \
	    umf_dl_triplet_nomap_nox.o umf_dl_triplet_map_x.o \
	    umf_dl_assemble_fixq.o umf_dl_assemble.o \
	    umf_dl_blas3_update.o umf_dl_build_tuples.o \
	    umf_dl_create_element.o umf_dl_dump.o umf_dl_extend_front.o \
	    umf_dl_garbage_collection.o umf_dl_get_memory.o \
	    umf_dl_init_front.o umf_dl_kernel.o umf_dl_kernel_init.o \
	    umf_dl_kernel_wrapup.o umf_dl_local_search.o umf_dl_lsolve.o \
	    umf_dl_ltsolve.o umf_dl_mem_alloc_element.o \
	    umf_dl_mem_alloc_head_block.o umf_dl_mem_alloc_tail_block.o \
	    umf_dl_mem_free_tail_block.o umf_dl_mem_init_memoryspace.o \
	    umf_dl_report_vector.o umf_dl_row_search.o umf_dl_scale_column.o \
	    umf_dl_set_stats.o umf_dl_solve.o umf_dl_symbolic_usage.o \
	    umf_dl_transpose.o umf_dl_tuple_lengths.o umf_dl_usolve.o \
	    umf_dl_utsolve.o umf_dl_valid_numeric.o umf_dl_valid_symbolic.o \
	    umf_dl_grow_front.o umf_dl_start_front.o umf_dl_2by2.o \
	    umf_dl_store_lu.o umf_dl_scale.o umfpack_dl_wsolve.o \
	    umfpack_dl_col_to_triplet.o umfpack_dl_defaults.o \
	    umfpack_dl_free_numeric.o umfpack_dl_free_symbolic.o \
	    umfpack_dl_get_numeric.o umfpack_dl_get_lunz.o \
	    umfpack_dl_get_symbolic.o umfpack_dl_numeric.o \
	    umfpack_dl_qsymbolic.o umfpack_dl_report_control.o \
	    umfpack_dl_report_info.o umfpack_dl_report_matrix.o \
	    umfpack_dl_report_numeric.o umfpack_dl_report_perm.o \
	    umfpack_dl_report_status.o umfpack_dl_report_symbolic.o \
	    umfpack_dl_report_triplet.o umfpack_dl_report_vector.o \
	    umfpack_dl_solve.o umfpack_dl_symbolic.o umfpack_dl_transpose.o \
	    umfpack_dl_triplet_to_col.o umfpack_dl_scale.o \
	    umfpack_dl_load_numeric.o umfpack_dl_save_numeric.o \
	    umfpack_dl_load_symbolic.o umfpack_dl_save_symbolic.o \
	    umf_zi_lhsolve.o \
	    umf_zi_uhsolve.o umf_zi_triplet_map_nox.o umf_zi_triplet_nomap_x.o \
	    umf_zi_triplet_nomap_nox.o umf_zi_triplet_map_x.o \
	    umf_zi_assemble_fixq.o umf_zi_assemble.o \
	    umf_zi_blas3_update.o umf_zi_build_tuples.o \
	    umf_zi_create_element.o umf_zi_dump.o umf_zi_extend_front.o \
	    umf_zi_garbage_collection.o umf_zi_get_memory.o \
	    umf_zi_init_front.o umf_zi_kernel.o umf_zi_kernel_init.o \
	    umf_zi_kernel_wrapup.o umf_zi_local_search.o umf_zi_lsolve.o \
	    umf_zi_ltsolve.o umf_zi_mem_alloc_element.o \
	    umf_zi_mem_alloc_head_block.o umf_zi_mem_alloc_tail_block.o \
	    umf_zi_mem_free_tail_block.o umf_zi_mem_init_memoryspace.o \
	    umf_zi_report_vector.o umf_zi_row_search.o umf_zi_scale_column.o \
	    umf_zi_set_stats.o umf_zi_solve.o umf_zi_symbolic_usage.o \
	    umf_zi_transpose.o umf_zi_tuple_lengths.o umf_zi_usolve.o \
	    umf_zi_utsolve.o umf_zi_valid_numeric.o umf_zi_valid_symbolic.o \
	    umf_zi_grow_front.o umf_zi_start_front.o umf_zi_2by2.o \
	    umf_zi_store_lu.o umf_zi_scale.o umfpack_zi_wsolve.o \
	    umfpack_zi_col_to_triplet.o umfpack_zi_defaults.o \
	    umfpack_zi_free_numeric.o umfpack_zi_free_symbolic.o \
	    umfpack_zi_get_numeric.o umfpack_zi_get_lunz.o \
	    umfpack_zi_get_symbolic.o umfpack_zi_numeric.o \
	    umfpack_zi_qsymbolic.o umfpack_zi_report_control.o \
	    umfpack_zi_report_info.o umfpack_zi_report_matrix.o \
	    umfpack_zi_report_numeric.o umfpack_zi_report_perm.o \
	    umfpack_zi_report_status.o umfpack_zi_report_symbolic.o \
	    umfpack_zi_report_triplet.o umfpack_zi_report_vector.o \
	    umfpack_zi_solve.o umfpack_zi_symbolic.o umfpack_zi_transpose.o \
	    umfpack_zi_triplet_to_col.o umfpack_zi_scale.o \
	    umfpack_zi_load_numeric.o umfpack_zi_save_numeric.o \
	    umfpack_zi_load_symbolic.o umfpack_zi_save_symbolic.o \
	    umf_zl_lhsolve.o \
	    umf_zl_uhsolve.o umf_zl_triplet_map_nox.o umf_zl_triplet_nomap_x.o \
	    umf_zl_triplet_nomap_nox.o umf_zl_triplet_map_x.o \
	    umf_zl_assemble_fixq.o umf_zl_assemble.o \
	    umf_zl_blas3_update.o umf_zl_build_tuples.o \
	    umf_zl_create_element.o umf_zl_dump.o umf_zl_extend_front.o \
	    umf_zl_garbage_collection.o umf_zl_get_memory.o \
	    umf_zl_init_front.o umf_zl_kernel.o umf_zl_kernel_init.o \
	    umf_zl_kernel_wrapup.o umf_zl_local_search.o umf_zl_lsolve.o \
	    umf_zl_ltsolve.o umf_zl_mem_alloc_element.o \
	    umf_zl_mem_alloc_head_block.o umf_zl_mem_alloc_tail_block.o \
	    umf_zl_mem_free_tail_block.o umf_zl_mem_init_memoryspace.o \
	    umf_zl_report_vector.o umf_zl_row_search.o umf_zl_scale_column.o \
	    umf_zl_set_stats.o umf_zl_solve.o umf_zl_symbolic_usage.o \
	    umf_zl_transpose.o umf_zl_tuple_lengths.o umf_zl_usolve.o \
	    umf_zl_utsolve.o umf_zl_valid_numeric.o umf_zl_valid_symbolic.o \
	    umf_zl_grow_front.o umf_zl_start_front.o umf_zl_2by2.o \
	    umf_zl_store_lu.o umf_zl_scale.o umfpack_zl_wsolve.o \
	    umfpack_zl_col_to_triplet.o umfpack_zl_defaults.o \
	    umfpack_zl_free_numeric.o umfpack_zl_free_symbolic.o \
	    umfpack_zl_get_numeric.o umfpack_zl_get_lunz.o \
	    umfpack_zl_get_symbolic.o umfpack_zl_numeric.o \
	    umfpack_zl_qsymbolic.o umfpack_zl_report_control.o \
	    umfpack_zl_report_info.o umfpack_zl_report_matrix.o \
	    umfpack_zl_report_numeric.o umfpack_zl_report_perm.o \
	    umfpack_zl_report_status.o umfpack_zl_report_symbolic.o \
	    umfpack_zl_report_triplet.o umfpack_zl_report_vector.o \
	    umfpack_zl_solve.o umfpack_zl_symbolic.o umfpack_zl_transpose.o \
	    umfpack_zl_triplet_to_col.o umfpack_zl_scale.o \
	    umfpack_zl_load_numeric.o umfpack_zl_save_numeric.o \
	    umfpack_zl_load_symbolic.o umfpack_zl_save_symbolic.o )
	    @echo " "
	    @echo "Library files are located in      ani2D/lib"
	    @echo " "
