./configure : auto-detect OpenBLAS and MKL
[scilab.git] / scilab / m4 / libsmath.m4
1 dnl ----------------------------------------------------------------------------
2 dnl @synopsis ACX_BLAS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
3 dnl
4 dnl This macro looks for a library that implements the BLAS
5 dnl linear-algebra interface (see http://www.netlib.org/blas/).
6 dnl On success, it sets the BLAS_LIBS output variable to
7 dnl hold the requisite library linkages.
8 dnl
9 dnl To link with BLAS, you should link with:
10 dnl
11 dnl     $BLAS_LIBS $LIBS $FLIBS
12 dnl
13 dnl in that order.  FLIBS is the output variable of the
14 dnl AC_F77_LIBRARY_LDFLAGS macro (called if necessary by ACX_BLAS),
15 dnl and is sometimes necessary in order to link with F77 libraries.
16 dnl Users will also need to use AC_F77_DUMMY_MAIN (see the autoconf
17 dnl manual), for the same reason.
18 dnl
19 dnl Many libraries are searched for, from ATLAS to CXML to ESSL.
20 dnl The user may also use --with-blas=<lib> in order to use some
21 dnl specific BLAS library <lib>.  In order to link successfully,
22 dnl however, be aware that you will probably need to use the same
23 dnl Fortran compiler (which can be set via the F77 env. var.) as
24 dnl was used to compile the BLAS library.
25 dnl
26 dnl ACTION-IF-FOUND is a list of shell commands to run if a BLAS
27 dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
28 dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
29 dnl the default action will define HAVE_BLAS.
30 dnl
31 dnl This macro requires autoconf 2.50 or later.
32 dnl
33 dnl @version acsite.m4,v 1.3 2002/08/02 09:28:12 steve Exp
34 dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
35 dnl
36 AC_DEFUN([ACX_BLAS], [
37 AC_PREREQ(2.50)
38 AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS])
39 acx_blas_ok=no
40 acx_blas_save_LIBS="$LIBS"
41
42 AC_ARG_WITH(blas-library,
43             AC_HELP_STRING([--with-blas-library=DIR], [set the path to the BLAS (refblas, Atlas, MKL...) library]))
44 saved_ldflags="$LDFLAGS"
45
46
47 if test "$with_blas_library" != no -a "$with_blas_library" != ""; then
48 LDFLAGS="$LDFLAGS -L$with_blas_library"
49 fi
50
51 # Get fortran linker names of BLAS functions to check for.
52 AC_F77_FUNC(sgemm)
53 AC_F77_FUNC(dgemm)
54
55 LIBS="$LIBS $FLIBS"
56
57 # First, check BLAS_LIBS environment variable
58 if test $acx_blas_ok = no; then
59 if test "x$BLAS_LIBS" != x; then
60         save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS"
61         AC_MSG_CHECKING([for $sgemm in $BLAS_LIBS])
62         AC_TRY_LINK_FUNC($sgemm, [acx_blas_ok=yes; BLAS_TYPE="Using BLAS_LIBS environment variable"], [BLAS_LIBS=""])
63         AC_MSG_RESULT($acx_blas_ok)
64         LIBS="$save_LIBS"
65 fi
66 fi
67
68 # BLAS linked to by default?  (happens on some supercomputers)
69 if test $acx_blas_ok = no; then
70         save_LIBS="$LIBS"; LIBS="$LIBS"
71         AC_CHECK_FUNC($sgemm, [acx_blas_ok=yes; BLAS_TYPE="Linked"])
72         LIBS="$save_LIBS"
73 fi
74
75 # BLAS in OpenBlas library (http://www.openblas.net/)
76 if test $acx_blas_ok = no; then
77     AC_CHECK_LIB(openblas, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="OpenBLAS"; BLAS_LIBS="-lopenblas"])
78 fi
79
80 # BLAS in ATLAS library (http://math-atlas.sourceforge.net/)
81 if test $acx_blas_ok = no; then
82         AC_CHECK_LIB(f77blas, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="Atlas"; BLAS_LIBS="-lf77blas"], [
83                 AC_CHECK_LIB(f77blas, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="Atlas"; BLAS_LIBS="-lf77blas -latlas"], [], [-latlas])])
84 fi
85
86 # BLAS in Intel MKL libraries (http://software.intel.com/en-us/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103)
87 if test $acx_blas_ok = no; then
88         AC_CHECK_LIB(mkl_rt, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="MKL"; BLAS_LIBS="-lmkl_rt"])
89 fi
90
91 # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
92 if test $acx_blas_ok = no; then
93         AC_CHECK_LIB(blas, $sgemm,
94                 [AC_CHECK_LIB(dgemm, $dgemm,
95                 [AC_CHECK_LIB(sgemm, $sgemm,
96                         [acx_blas_ok=yes; BLAS_TYPE="PhiPACK"; BLAS_LIBS="-lsgemm -ldgemm -lblas"],
97                         [], [-lblas])],
98                         [], [-lblas])])
99 fi
100
101 # BLAS in Alpha CXML library?
102 if test $acx_blas_ok = no; then
103         AC_CHECK_LIB(cxml, $sgemm, [acx_blas_ok=yes;BLAS_TYPE="Alpha CXML"; BLAS_LIBS="-lcxml"])
104 fi
105
106 # BLAS in Alpha DXML library? (now called CXML, see above)
107 if test $acx_blas_ok = no; then
108         AC_CHECK_LIB(dxml, $sgemm, [acx_blas_ok=yes;BLAS_TYPE="Alpha DXML"; BLAS_LIBS="-ldxml"])
109 fi
110
111 # BLAS in Sun Performance library?
112 if test $acx_blas_ok = no; then
113         if test "x$GCC" != xyes; then # only works with Sun CC
114                 AC_CHECK_LIB(sunmath, acosp,
115                         [AC_CHECK_LIB(sunperf, $sgemm,
116                                 [BLAS_LIBS="-xlic_lib=sunperf -lsunmath";
117                                                                 BLAS_TYPE="Sun Performance library";
118                                  acx_blas_ok=yes],[],[-lsunmath])])
119         fi
120 fi
121
122 # BLAS in SCSL library?  (SGI/Cray Scientific Library)
123 if test $acx_blas_ok = no; then
124         AC_CHECK_LIB(scs, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="SCSL"; BLAS_LIBS="-lscs"])
125 fi
126
127 # BLAS in SGIMATH library?
128 if test $acx_blas_ok = no; then
129         AC_CHECK_LIB(complib.sgimath, $sgemm,
130                      [acx_blas_ok=yes; BLAS_TYPE="SGIMATH"; BLAS_LIBS="-lcomplib.sgimath"])
131 fi
132
133 # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
134 if test $acx_blas_ok = no; then
135         AC_CHECK_LIB(blas, $sgemm,
136                 [AC_CHECK_LIB(essl, $sgemm,
137                         [acx_blas_ok=yes; BLAS_TYPE="IBM ESSL"; BLAS_LIBS="-lessl -lblas"],
138                         [], [-lblas $FLIBS])])
139 fi
140
141 # Generic BLAS library?
142 if test $acx_blas_ok = no; then
143         AC_CHECK_LIB(blas, $sgemm, [acx_blas_ok=yes; BLAS_TYPE="Generic Blas"; BLAS_LIBS="-lblas"])
144 fi
145
146 if test "$with_blas_library" != no -a "$with_blas_library" != ""; then
147 BLAS_LIBS="-L$with_blas_library $BLAS_LIBS"
148 fi
149
150 AC_SUBST(BLAS_LIBS)
151
152 LIBS="$acx_blas_save_LIBS"
153 LDFLAGS="$saved_ldflags"
154
155 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
156 if test x"$acx_blas_ok" = xyes; then
157         ifelse([$1],,,[$1])
158         :
159 else
160         acx_blas_ok=no
161         $2
162 fi
163 ])dnl ACX_BLAS
164
165
166
167
168
169 dnl ----------------------------------------------------------------------------
170 dnl @synopsis ACX_LAPACK([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
171 dnl
172 dnl This macro looks for a library that implements the LAPACK
173 dnl linear-algebra interface (see http://www.netlib.org/lapack/).
174 dnl On success, it sets the LAPACK_LIBS output variable to
175 dnl hold the requisite library linkages.
176 dnl
177 dnl To link with LAPACK, you should link with:
178 dnl
179 dnl     $LAPACK_LIBS $BLAS_LIBS $LIBS $FLIBS
180 dnl
181 dnl in that order.  BLAS_LIBS is the output variable of the ACX_BLAS
182 dnl macro, called automatically.  FLIBS is the output variable of the
183 dnl AC_F77_LIBRARY_LDFLAGS macro (called if necessary by ACX_BLAS),
184 dnl and is sometimes necessary in order to link with F77 libraries.
185 dnl Users will also need to use AC_F77_DUMMY_MAIN (see the autoconf
186 dnl manual), for the same reason.
187 dnl
188 dnl The user may also use --with-lapack-library=<DIR> in order to use some
189 dnl specific LAPACK library <lib>.  In order to link successfully,
190 dnl however, be aware that you will probably need to use the same
191 dnl Fortran compiler (which can be set via the F77 env. var.) as
192 dnl was used to compile the LAPACK and BLAS libraries.
193 dnl
194 dnl ACTION-IF-FOUND is a list of shell commands to run if a LAPACK
195 dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
196 dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
197 dnl the default action will define HAVE_LAPACK.
198 dnl
199 dnl @version acsite.m4,v 1.3 2002/08/02 09:28:12 steve Exp
200 dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
201
202 AC_DEFUN([ACX_LAPACK], [
203 AC_REQUIRE([ACX_BLAS])
204 acx_lapack_ok=no
205
206 AC_ARG_WITH(lapack-library,
207             AC_HELP_STRING([--with-lapack-library=DIR], [set the path to the LAPACK library]))
208 saved_ldflags="$LDFLAGS"
209
210 if test "$with_lapack_library" != no -a "$with_lapack_library" != ""; then
211 LDFLAGS="$LDFLAGS -L$with_lapack_library"
212 fi
213
214
215 # Get fortran linker name of LAPACK function to check for.
216 AC_F77_FUNC(cheev)
217
218 # We cannot use LAPACK if BLAS is not found
219 if test "x$acx_blas_ok" != xyes; then
220         acx_lapack_ok=noblas
221 fi
222
223 # First, check LAPACK_LIBS environment variable
224 if test "x$LAPACK_LIBS" != x; then
225         save_LIBS="$LIBS"; LIBS="$LAPACK_LIBS $BLAS_LIBS $LIBS $FLIBS"
226         AC_MSG_CHECKING([for $cheev in $LAPACK_LIBS])
227         AC_TRY_LINK_FUNC($cheev, [acx_lapack_ok=yes; LAPACK_TYPE="LAPACK_LIBS env variable"], [LAPACK_LIBS=""])
228         AC_MSG_RESULT($acx_lapack_ok)
229         LIBS="$save_LIBS"
230         if test acx_lapack_ok = no; then
231                 LAPACK_LIBS=""
232         fi
233 fi
234
235 # LAPACK linked to by default?  (is sometimes included in BLAS lib)
236 if test $acx_lapack_ok = no; then
237         save_LIBS="$LIBS"; LIBS="$LIBS $BLAS_LIBS $FLIBS"
238         AC_CHECK_FUNC($cheev, [acx_lapack_ok=yes; LAPACK_TYPE="Default link (may be provided with BLAS)"])
239         LIBS="$save_LIBS"
240 fi
241
242 # Generic LAPACK library?
243 for lapack in lapack lapack_rs6k; do
244         if test $acx_lapack_ok = no; then
245                 save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS"
246                 AC_CHECK_LIB($lapack, $cheev,
247                     [acx_lapack_ok=yes; LAPACK_TYPE="Library -l$lapack"; LAPACK_LIBS="-l$lapack"], [], [$FLIBS])
248                 LIBS="$save_LIBS"
249         fi
250 done
251
252 LDFLAGS="$saved_ldflags"
253
254 if test "$with_lapack_library" != no -a "$with_lapack_library" != ""; then
255 LAPACK_LIBS="$LAPACK_LIBS -L$with_lapack_library"
256 fi
257
258 AC_SUBST(LAPACK_LIBS)
259
260 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
261 if test x"$acx_lapack_ok" = xyes; then
262         ifelse([$1],,,[$1])
263         :
264 else
265         acx_lapack_ok=no
266         $2
267 fi
268 ])dnl ACX_LAPACK
269
270
271 dnl ----------------------------------------------------------------------------
272 dnl @synopsis ACX_ARPACK([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
273 dnl
274 dnl This macro looks for a library that implements the ARPACK
275 dnl collection of Fortran77 subroutines designed to solve large 
276 dnl scale eigenvalue problems (http://forge.scilab.org/index.php/p/arpack-ng/).
277 dnl On success, it sets the ARPACK_LIBS output variable to
278 dnl hold the requisite library linkages.
279 dnl
280 dnl To link with ARPACK, you should link with:
281 dnl
282 dnl     $ARPACK_LIBS $BLAS_LIBS $LIBS $FLIBS
283 dnl
284 dnl in that order.  BLAS_LIBS is the output variable of the ACX_BLAS
285 dnl macro, called automatically.  FLIBS is the output variable of the
286 dnl AC_F77_LIBRARY_LDFLAGS macro (called if necessary by ACX_BLAS),
287 dnl and is sometimes necessary in order to link with F77 libraries.
288 dnl Users will also need to use AC_F77_DUMMY_MAIN (see the autoconf
289 dnl manual), for the same reason.
290 dnl
291 dnl The user may also use --with-arpack-library=<DIR> in order to use some
292 dnl specific ARPACK library <lib>.  In order to link successfully,
293 dnl however, be aware that you will probably need to use the same
294 dnl Fortran compiler (which can be set via the F77 env. var.) as
295 dnl was used to compile the ARPACK and BLAS libraries.
296 dnl
297 dnl ACTION-IF-FOUND is a list of shell commands to run if a ARPACK
298 dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
299 dnl to run it if it is not found.  If ACTION-IF-FOUND is not specified,
300 dnl the default action will define HAVE_ARPACK.
301 dnl
302 dnl @version acsite.m4,v 1.3 2002/08/02 09:28:12 steve Exp
303 dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
304 dnl @author Sylvestre Ledru <sylvestre.ledru@scilab-enterprises.com>
305
306 AC_DEFUN([ACX_ARPACK], [
307 AC_REQUIRE([ACX_BLAS])
308 acx_arpack_ok=no
309
310 AC_ARG_WITH(arpack-library,
311             AC_HELP_STRING([--with-arpack-library=DIR], [set the path to the ARPACK library]))
312 saved_ldflags="$LDFLAGS"
313
314 if test "$with_arpack_library" != no -a "$with_arpack_library" != ""; then
315 LDFLAGS="$LDFLAGS -L$with_arpack_library"
316 fi
317
318 ARPACK_LIBS="-larpack"
319 # Get fortran linker name of ARPACK function to check for.
320 AC_F77_FUNC(znaupd)
321
322 # We cannot use ARPACK if BLAS is not found
323 if test "x$acx_blas_ok" != xyes; then
324         acx_arpack_ok=noblas
325 fi
326
327 # First, check ARPACK_LIBS environment variable
328 if test "x$ARPACK_LIBS" != x; then
329         save_LIBS="$LIBS"; LIBS="$ARPACK_LIBS $BLAS_LIBS $LIBS $FLIBS"
330         AC_MSG_CHECKING([for $znaupd in $ARPACK_LIBS])
331         AC_TRY_LINK_FUNC($znaupd, [acx_arpack_ok=yes], [ARPACK_LIBS="-larpack"])
332         AC_MSG_RESULT($acx_arpack_ok)
333         LIBS="$save_LIBS"
334         if test acx_arpack_ok = no; then
335                 ARPACK_LIBS=""
336         fi
337 fi
338
339
340 LDFLAGS="$saved_ldflags"
341
342 if test "$with_arpack_library" != no -a "$with_arpack_library" != ""; then
343 ARPACK_LIBS="$ARPACK_LIBS -L$with_arpack_library"
344 fi
345
346 AC_SUBST(ARPACK_LIBS)
347
348 # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
349 if test x"$acx_arpack_ok" = xyes; then
350         ifelse([$1],,,[$1])
351         :
352 else
353         acx_arpack_ok=no
354         $2
355 fi
356 ])dnl ACX_ARPACK
357 dnl
358 dnl Check whether ARPACK works (does not crash)
359 dnl
360 dnl Using a pure Fortran program doesn't seem to crash when linked
361 dnl with the buggy ARPACK library but the C++ program does.  Maybe
362 dnl it is the memory allocation that exposes the bug and using statically
363 dnl allocated arrays in Fortran does not?
364 dnl
365 dnl Copyright (C) 1995-2012 John W. Eaton
366 dnl
367 dnl This code is released under the GPL license.
368 dnl
369 AC_DEFUN([CHECK_ARPACK_OK], [
370   AC_LANG_PUSH(C++)
371   save_LIBS="$LIBS"; LIBS="$ARPACK_LIBS $BLAS_LIBS $LIBS $FLIBS"
372   AC_CACHE_CHECK([whether the arpack library works],
373     [lib_cv_arpack_ok], [
374       AC_RUN_IFELSE([AC_LANG_PROGRAM([[
375 // External functions from ARPACK library
376 extern "C" int
377 C2F(dnaupd) (int&, const char *, const int&, const char *,
378                            int&, const double&, double*, const int&,
379                            double*, const int&, int*, int*, double*,
380                            double*, const int&, int&, long int, long int);
381
382 extern "C" int
383 C2F(dneupd) (const int&, const char *, int*, double*,
384                            double*, double*, const int&,
385                            const double&, const double&, double*,
386                            const char*, const int&, const char *,
387                            int&, const double&, double*, const int&,
388                            double*, const int&, int*, int*, double*,
389                            double*, const int&, int&, long int,
390                            long int, long int);
391
392 extern "C" int
393 C2F(dgemv) (const char *, const int&, const int&,
394                          const double&, const double*, const int&,
395                          const double*, const int&, const double&,
396                          double*, const int&, long int);
397
398 #include <cfloat>
399
400 void
401 doit (void)
402 {
403   // Based on Octave function EigsRealNonSymmetricMatrix from liboctave/eigs-base.cc.
404
405   // Problem matrix.  See bug #31479
406   int n = 4;
407   double *m = new double [n * n];
408   m[0] = 1, m[4] = 0, m[8]  = 0, m[12] = -1;
409   m[1] = 0, m[5] = 1, m[9]  = 0, m[13] = 0;
410   m[2] = 0, m[6] = 0, m[10] = 1, m[14] = 0;
411   m[3] = 0, m[7] = 0, m[11] = 2, m[15] = 1;
412
413   double *resid = new double [4];
414
415   resid[0] = 0.960966;
416   resid[1] = 0.741195;
417   resid[2] = 0.150143;
418   resid[3] = 0.868067;
419
420   int *ip = new int [11];
421
422   ip[0] = 1;   // ishift
423   ip[1] = 0;   // ip[1] not referenced
424   ip[2] = 300; // mxiter, maximum number of iterations
425   ip[3] = 1;   // NB blocksize in recurrence
426   ip[4] = 0;   // nconv, number of Ritz values that satisfy convergence
427   ip[5] = 0;   // ip[5] not referenced
428   ip[6] = 1;   // mode
429   ip[7] = 0;   // ip[7] to ip[10] are return values
430   ip[8] = 0;
431   ip[9] = 0;
432   ip[10] = 0;
433  
434   int *ipntr = new int [14];
435
436   int k = 1;
437   int p = 3;
438   int lwork = 3 * p * (p + 2);
439
440   double *v = new double [n * (p + 1)];
441   double *workl = new double [lwork + 1];
442   double *workd = new double [3 * n + 1];
443
444   int ido = 0;
445   int info = 0;
446
447   double tol = DBL_EPSILON;
448
449   do 
450     {
451       C2F(dnaupd) (ido, "I", n, "LM", k, tol, resid, p,
452                                  v, n, ip, ipntr, workd, workl, lwork,
453                                  info, 1L, 2L);
454
455       if (ido == -1 || ido == 1 || ido == 2)
456         {
457           double *x = workd + ipntr[0] - 1;
458           double *y = workd + ipntr[1] - 1;
459
460           C2F(dgemv) ("N", n, n, 1.0, m, n, x, 1, 0.0,
461                                    y, 1, 1L);
462         }
463       else
464         {
465           if (info < 0)
466             {
467               return;  // Error
468             }
469
470           break;
471         }
472     } 
473   while (1);
474
475   int *sel = new int [p];
476
477   // The dimensions of dr and di are k+1, but k+2 avoids segfault
478   double *dr = new double [k + 1];
479   double *di = new double [k + 1];
480   double *workev = new double [3 * p];
481
482   for (int i = 0; i < k + 1; i++)
483     dr[i] = di[i] = 0.;
484
485   int rvec = 1;
486
487   double sigmar = 0.0;
488   double sigmai = 0.0;
489
490   // This is n*(k+1), but k+2 avoids segfault
491   double *z = new double [n * (k + 1)];
492
493   C2F(dneupd) (rvec, "A", sel, dr, di, z, n, sigmar,
494                              sigmai, workev, "I", n, "LM", k, tol,
495                              resid, p, v, n, ip, ipntr, workd,
496                              workl, lwork, info, 1L, 1L, 2L);
497 }
498 ]], [[
499   for (int i = 0; i < 10; i++)
500     doit ();
501 ]])],
502   [cv_lib_arpack_ok=yes],
503   [cv_lib_arpack_ok=no],
504   [cv_lib_arpack_ok=yes])])
505   LIBS="$save_LIBS"
506   AC_LANG_POP(C++)
507   if test "$cv_lib_arpack_ok" = "yes"; then
508     $1
509   else
510     $2
511   fi
512 ])