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