1# include the environment, compilation, and linking flags 2 3include ../Make_flags 4include ../Link_flags 5 6#------------------------------------------------ 7 8 9SOBJS= COMMON/shared_utils.o COMMON/ioandtest.o 10COMMON_INCLUDE = -I./COMMON -I../include 11INCLUDE := $(COMMON_INCLUDE) 12FINCLUDE := $(COMMON_INCLUDE) 13LIBS := ../lib/libprimme.so $(LIBS) 14 15USE_NATIVE ?= yes 16USE_PETSC ?= $(if $(findstring undefined,$(origin PETSC_DIR)),no,yes) 17USE_PARASAILS ?= $(if $(findstring undefined,$(origin PARASAILS_LIB_DIR)),no,yes) 18USE_MPI ?= $(if $(findstring mpi,$(CC)),yes,$(USE_PETSC)) 19USE_RSB ?= $(if $(findstring undefined,$(origin LIBRSB_LIB_DIR)),no,yes) 20 21ifeq ($(USE_MPI), yes) 22 DEFINES += -DUSE_MPI 23endif 24 25ifeq ($(USE_NATIVE), yes) 26 DEFINES += -DUSE_NATIVE 27 SOBJS += COMMON/csr.o COMMON/mat.o COMMON/ssrcsr.o COMMON/mmio.o 28 SOBJSdouble += COMMON/ilut.o COMMON/matvec.o 29 SOBJSdoublecomplex += COMMON/zilut.o COMMON/zmatvec.o 30endif 31 32ifeq ($(USE_PARASAILS), yes) 33 ifneq ($(USE_MPI), yes) 34 $(error "PARASAILS needs MPI") 35 endif 36 DEFINES += -DUSE_PARASAILS 37 SOBJS += COMMON/parasailsw.o COMMON/csr.o COMMON/ssrcsr.o COMMON/mmio.o 38 INCLUDE += -I$(PARASAILS_INCLUDE_DIR) 39 LIBDIRS += -L$(PARASAILS_LIB_DIR) 40 LIBS += -lParaSails 41endif 42 43ifeq ($(USE_PETSC), yes) 44 include ${PETSC_DIR}/lib/petsc/conf/variables 45 DEFINES += -DUSE_PETSC 46 SOBJS += COMMON/petscw.o COMMON/mmio.o 47 INCLUDE += $(PETSC_CCPPFLAGS) 48 FINCLUDE += $(PETSC_FCPPFLAGS) 49 LIBDIRS += $(PETSC_C_SH_LIB_PATH) 50 LIBS += $(PETSC_LIB) 51endif 52 53ifeq ($(USE_RSB), yes) 54 DEFINES += -DUSE_RSB 55 SOBJS += COMMON/rsbw.o 56 INCLUDE += -I$(LIBRSB_INCLUDE_DIR) 57 LIBDIRS += -L$(LIBRSB_LIB_DIR) 58 override LIBS += -lrsb 59 override LDFLAGS += -fopenmp 60 override CFLAGS += -fopenmp 61endif 62 63 64OBJS = $(sort $(SOBJS)) 65OBJSdouble = $(sort $(SOBJSdouble)) $(patsubst %.o,%double.o,$(OBJS)) 66OBJSdoublecomplex = $(sort $(SOBJSdoublecomplex)) $(patsubst %.o,%doublecomplex.o,$(OBJS)) 67 68primme_double: $(OBJSdouble) driverdouble.o 69 $(CLDR) -o primme_double $(OBJSdouble) driverdouble.o $(LIBDIRS) $(INCLUDE) $(LIBS) $(LDFLAGS) 70 71primme_doublecomplex: $(OBJSdoublecomplex) driverdoublecomplex.o 72 $(CLDR) -o primme_doublecomplex $(OBJSdoublecomplex) driverdoublecomplex.o $(LIBDIRS) $(INCLUDE) $(LIBS) $(LDFLAGS) 73 74primmesvds_double: $(OBJSdouble) driversvdsdouble.o 75 $(CLDR) -o primmesvds_double $(OBJSdouble) driversvdsdouble.o $(LIBDIRS) $(INCLUDE) $(LIBS) $(LDFLAGS) 76 77primmesvds_doublecomplex: $(OBJSdoublecomplex) driversvdsdoublecomplex.o 78 $(CLDR) -o primmesvds_doublecomplex $(OBJSdoublecomplex) driversvdsdoublecomplex.o $(LIBDIRS) $(INCLUDE) $(LIBS) $(LDFLAGS) 79 80%double.o: %.c 81 $(CC) $(CFLAGS) $(DEFINES) -DUSE_DOUBLE $(INCLUDE) -c $< -o $@ 82 83%doublecomplex.o: %.c 84 $(CC) $(CFLAGS) $(DEFINES) -DUSE_DOUBLECOMPLEX $(INCLUDE) -c $< -o $@ 85 86.f.o .F.o: 87 $(F77) $(FFLAGS) $(FINCLUDE) -c $< -o $@ 88 89all: drivers 90 91drivers: primme_double primme_doublecomplex primmesvds_double primmesvds_doublecomplex 92 93primme_double primme_doublecomplex primmesvds_double primmesvds_doublecomplex: ../lib/libprimme.so 94 95ifeq ($(USE_MPI), yes) 96 MPIRUN ?= mpirun -np 4 97endif 98 99TESTS_double = tests/test_0?? tests/testi-*.F 100TESTS_doublecomplex = tests/test_0?? tests/test_1?? tests/testi-*.F 101TESTSsvds_double = tests/test_2?? 102TESTSsvds_doublecomplex = tests/test_2?? 103EXTRA = 104 105all_tests: all_tests_double all_tests_doublecomplex all_testssvds_double all_testssvds_doublecomplex 106all_tests_save: all_tests_double_save all_tests_doublecomplex_save all_testssvds_double_save all_testssvds_doublecomplex_save 107 108all_tests_double all_tests_doublecomplex \ 109all_testssvds_double all_testssvds_doublecomplex: all_tests%: primme% tests_primme_interface 110 @echo "Please wait, this could take a while...";\ 111 ok="0";for i in $(TESTS$*) ; do \ 112 echo "********** Test $$i $* ***********"; \ 113 sed 's/sol_[^ ]*/&$*/' $$i > ._test00;\ 114 echo "$(EXTRA)" >> ._test00;\ 115 $(MPIRUN) ./primme$* ._test00 || ok="1"; \ 116 done > tests.log 2>&1;\ 117 if test $$ok -eq 0 ; then \ 118 awk 'BEGIN{c=i=mv=t=0} /^Iterations/{i+=$$3;c++} /^Matvecs/{mv+=$$3} /^Wallclock/{t+=$$4} END{printf("Tests: %d Iterations: %d Matvecs: %d Time: %d s\n", c,i,mv,t)}' tests.log; \ 119 echo "All tests passed!"; \ 120 else\ 121 cat tests.log;\ 122 echo "Some tests fail. Please consider to send us the file";\ 123 echo "tests/tests.log if the software doesn't work as expected.";\ 124 exit 1;\ 125 fi 126 127all_tests_double_save all_tests_doublecomplex_save \ 128all_testssvds_double_save all_testssvds_doublecomplex_save: all_tests%_save: primme% tests_primme_interface 129 @echo "Please wait, this could take a while...";\ 130 ok="0";for i in $(TESTS$*) ; do \ 131 echo "********** Test $$i $* ***********"; \ 132 sed 's/sol_[^ ]*/&$*/; s/checkXFile/saveXFile/' $$i > ._test00;\ 133 $(MPIRUN) ./primme$* ._test00 || ok="1"; \ 134 done > tests.log 2>&1;\ 135 if test $$ok -eq 0 ; then \ 136 echo "All tests passed!"; \ 137 else\ 138 cat tests.log;\ 139 echo "Some tests fail. Please consider to send us the file";\ 140 echo "tests/tests.log if the software doesn't work as expected.";\ 141 exit 1;\ 142 fi 143 144T_methods = DEFAULT_METHOD DYNAMIC DEFAULT_MIN_TIME DEFAULT_MIN_MATVECS Arnoldi GD_plusK GD_Olsen_plusK JD_Olsen_plusK JDQR JDQMR JDQMR_ETol STEEPEST_DESCENT LOBPCG_OrthoBasis LOBPCG_OrthoBasis_Window 145T_sizes = 0 1 2 3 4 5 6 7 10 100 146 147tests_primme_interface: $(patsubst %,laplace%.mtx,$(T_sizes)) 148 @rm -f tests/testi-*; \ 149 for method in $(T_methods); do \ 150 for n in $(T_sizes); do \ 151 for nevals in 0 1 2 3 4 5 6 15 100; do \ 152 [ $$nevals -gt $$n ] && continue || true; \ 153 for target in primme_smallest primme_largest primme_closest_abs primme_closest_geq; do \ 154 case "$$target-$$n-$$nevals-$$method" in \ 155 primme_closest_leq-[123]-*) continue ;; \ 156 primme_closest_leq-[4567]-1-*) ;; \ 157 primme_closest_leq-[4567]-*) continue ;; \ 158 primme_closest_leq-10-[12]-*) ;; \ 159 primme_closest_leq-10-*) continue ;; \ 160 primme_closest_geq-4-4-*) continue ;; \ 161 primme_closest_geq-5-5-*) continue ;; \ 162 primme_closest_geq-6-6-*) continue ;; \ 163 primme_closest_geq-7-7-*) continue ;; \ 164 primme_closest_[gl]eq-100-*-LOBPCG*) continue ;; \ 165 esac; \ 166 for proj in primme_proj_RR primme_proj_refined ; do \ 167 case "$$target-$$proj-$$method" in \ 168 primme_closest*-primme_proj_RR-LOBPCG*) continue ;; \ 169 primme_closest*-STEEPEST_DESCENT*) continue ;; \ 170 primme_closest*-Arnoldi*) continue ;; \ 171 primme_closest*-GD*) continue ;; \ 172 primme_closest*) ;; \ 173 *-primme_proj_RR*) ;; \ 174 *) continue ;; \ 175 esac; \ 176 f="tests/testi-$${n}-$${method}-$${nevals}-$${target}-$${proj}"; \ 177 echo "driver.matrixFile = laplace$$n.mtx" > $$f.F; \ 178 echo "driver.checkXFile = tests/sol_testi-$${n}-$${nevals}-$${target}" >> $$f.F; \ 179 echo "driver.PrecChoice = noprecond" >> $$f.F; \ 180 echo "primme.numEvals = $$nevals" >> $$f.F; \ 181 echo "primme.eps = 1e-6" >> $$f.F; \ 182 echo "primme.numTargetShifts = 1" >> $$f.F; \ 183 echo "primme.targetShifts = 0.5" >> $$f.F; \ 184 echo "primme.target = $$target" >> $$f.F; \ 185 echo "primme.projection.projection = $$proj" >> $$f.F; \ 186 echo "primme.maxMatvecs = 50000" >> $$f.F; \ 187 echo "method = PRIMME_$$method" >> $$f.F; \ 188 done; done; done; done; done 189 190laplace%.mtx: 191 @echo "%%MatrixMarket matrix coordinate real symmetric" > $@; \ 192 echo "$* $* $$(($*>0?2*$*-1:0))" >> $@; \ 193 for i in `seq 1 $*`; do \ 194 echo "$$i $$i 2.0" >> $@; \ 195 [ $$i -eq $* ] || echo "$$i $$((i+1)) -1.0" >> $@; \ 196 done 197 198clean: 199 @rm -f $(OBJSdouble) $(OBJSdoublecomplex) *.o tests.log tests/*.F $(patsubst %,laplace%.mtx,$(T_sizes)) ._test00 200 201veryclean: clean 202 @rm -f primme_double primme_doublecomplex primmesvds_double primmesvds_doublecomplex 203 204 205COMMON/csr.c: COMMON/csr.h COMMON/mmio.h 206COMMON/csr.h: COMMON/num.h 207COMMON/mat.c: COMMON/native.h 208COMMON/mmio.c: COMMON/mmio.h 209COMMON/native.h: COMMON/csr.h 210COMMON/parasailsw.c: COMMON/parasailsw.h COMMON/csr.h 211COMMON/parasailsw.h: COMMON/csr.h 212COMMON/petscw.c: COMMON/petscw.h COMMON/mmio.h 213COMMON/petscw.h: COMMON/num.h 214COMMON/shared_utils.c: COMMON/shared_utils.h 215COMMON/ioandtest.c: COMMON/num.h COMMON/ioandtest.h 216COMMON/driver.c: COMMON/shared_utils.h COMMON/native.h COMMON/parasailsw.h COMMON/petscw.h 217 218.PHONY: clean veryclean all drivers examples 219