diff --git a/config/pac.m4 b/config/pac.m4 index 0fa7324e..46a56b68 100644 --- a/config/pac.m4 +++ b/config/pac.m4 @@ -1850,7 +1850,7 @@ fi if test "x$pac_metis_header_ok" == "xyes" ; then AC_LANG_PUSH([C]) - AC_MSG_CHECKING([for METIS idx size]) + AC_MSG_CHECKING([for METIS integer size]) AC_LINK_IFELSE([AC_LANG_SOURCE( #include #include "$psblas_cv_metisincfile" @@ -1865,6 +1865,23 @@ if test "x$pac_metis_header_ok" == "xyes" ; then AC_LANG_POP() fi +if test "x$pac_metis_header_ok" == "xyes" ; then + AC_LANG_PUSH([C]) + AC_MSG_CHECKING([for METIS real size]) + AC_LINK_IFELSE([AC_LANG_SOURCE( + #include + #include "$psblas_cv_metisincfile" + void main(){ + printf("%d\n",REALTYPEWIDTH); + } + )], + [pac_cv_metis_real=`./conftest${ac_exeext} | sed 's/^ *//'`], + [pac_cv_metis_real="unknown"]) + AC_MSG_RESULT($pac_cv_metis_real) + + AC_LANG_POP() +fi + if test "x$pac_metis_header_ok" = "xyes" ; then psblas_cv_metis_includes="$METIS_INCLUDES" METIS_LIBS="$psblas_cv_metis $METIS_LIBDIR" diff --git a/configure b/configure index bacb6175..e8688547 100755 --- a/configure +++ b/configure @@ -8988,8 +8988,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for METIS idx size" >&5 -$as_echo_n "checking for METIS idx size... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for METIS integer size" >&5 +$as_echo_n "checking for METIS integer size... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -9017,6 +9017,42 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi +if test "x$pac_metis_header_ok" == "xyes" ; then + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for METIS real size" >&5 +$as_echo_n "checking for METIS real size... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include "$psblas_cv_metisincfile" + void main(){ + printf("%d\n",REALTYPEWIDTH); + } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pac_cv_metis_real=`./conftest${ac_exeext} | sed 's/^ *//'` +else + pac_cv_metis_real="unknown" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pac_cv_metis_real" >&5 +$as_echo "$pac_cv_metis_real" >&6; } + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi + if test "x$pac_metis_header_ok" = "xyes" ; then psblas_cv_metis_includes="$METIS_INCLUDES" METIS_LIBS="$psblas_cv_metis $METIS_LIBDIR" @@ -9180,9 +9216,14 @@ if test "x$pac_cv_metis_idx" == "xunknown" ; then $as_echo "$as_me: Unknown METIS bitsize." >&6;} $psblas_cv_have_metis = "no"; fi +if test "x$pac_cv_metis_real" == "xunknown" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Unknown METIS REAL bitsize." >&5 +$as_echo "$as_me: Unknown METIS REAL bitsize." >&6;} + $psblas_cv_have_metis = "no"; +fi if test "x$psblas_cv_have_metis" == "xyes" ; then - FDEFINES="$psblas_cv_define_prepend-DHAVE_METIS $psblas_cv_define_prepend-DMETIS_$pac_cv_metis_idx $FDEFINES" - CDEFINES="-DHAVE_METIS_ $psblas_cv_metis_includes $CDEFINES -DMETIS_$pac_cv_metis_idx" + FDEFINES="$psblas_cv_define_prepend-DHAVE_METIS $psblas_cv_define_prepend-DMETIS_$pac_cv_metis_idx $psblas_cv_define_prepend-DMETIS_REAL_$pac_cv_metis_real $FDEFINES" + CDEFINES="-DHAVE_METIS_ $psblas_cv_metis_includes $CDEFINES -DMETIS_$pac_cv_metis_idx -DMETIS_REAL_$pac_cv_metis_real" METISINCFILE=$psblas_cv_metisincfile fi @@ -10807,6 +10848,7 @@ fi METIS usable : ${psblas_cv_have_metis} METIS bitsize : ${pac_cv_metis_idx} + METIS realsize : ${pac_cv_metis_real} AMD detected : ${psblas_cv_have_amd} LIBS : ${LIBS} LDLIBS : ${LDLIBS} @@ -10836,6 +10878,7 @@ $as_echo "$as_me: METIS usable : ${psblas_cv_have_metis} METIS bitsize : ${pac_cv_metis_idx} + METIS realsize : ${pac_cv_metis_real} AMD detected : ${psblas_cv_have_amd} LIBS : ${LIBS} LDLIBS : ${LDLIBS} diff --git a/configure.ac b/configure.ac index 8bfd5806..a2650489 100755 --- a/configure.ac +++ b/configure.ac @@ -716,9 +716,14 @@ if test "x$pac_cv_metis_idx" == "xunknown" ; then AC_MSG_NOTICE([Unknown METIS bitsize.]) $psblas_cv_have_metis = "no"; fi +if test "x$pac_cv_metis_real" == "xunknown" ; then + dnl mismatch between metis size and PSBLAS LPK + AC_MSG_NOTICE([Unknown METIS REAL bitsize.]) + $psblas_cv_have_metis = "no"; +fi if test "x$psblas_cv_have_metis" == "xyes" ; then - FDEFINES="$psblas_cv_define_prepend-DHAVE_METIS $psblas_cv_define_prepend-DMETIS_$pac_cv_metis_idx $FDEFINES" - CDEFINES="-DHAVE_METIS_ $psblas_cv_metis_includes $CDEFINES -DMETIS_$pac_cv_metis_idx" + FDEFINES="$psblas_cv_define_prepend-DHAVE_METIS $psblas_cv_define_prepend-DMETIS_$pac_cv_metis_idx $psblas_cv_define_prepend-DMETIS_REAL_$pac_cv_metis_real $FDEFINES" + CDEFINES="-DHAVE_METIS_ $psblas_cv_metis_includes $CDEFINES -DMETIS_$pac_cv_metis_idx -DMETIS_REAL_$pac_cv_metis_real" METISINCFILE=$psblas_cv_metisincfile fi @@ -836,6 +841,7 @@ AC_MSG_NOTICE([ METIS usable : ${psblas_cv_have_metis} METIS bitsize : ${pac_cv_metis_idx} + METIS realsize : ${pac_cv_metis_real} AMD detected : ${psblas_cv_have_amd} LIBS : ${LIBS} dnl Note : we should use LDLIBS sooner or later! diff --git a/util/psb_metis_int.c b/util/psb_metis_int.c index 0b76c2a6..5f451cb7 100644 --- a/util/psb_metis_int.c +++ b/util/psb_metis_int.c @@ -2,6 +2,8 @@ #if defined(HAVE_METIS_) #include "psb_metis_int.h" +#if defined(METIS_REAL_32) + int metis_PartGraphKway_C(idx_t *n, idx_t *ixadj, idx_t *iadj, idx_t *ivwg, idx_t *iajw, idx_t *nparts, float *weights, idx_t *graphpart) @@ -34,6 +36,39 @@ int metis_PartGraphKway_C(idx_t *n, idx_t *ixadj, idx_t *iadj, idx_t *ivwg, } } +#elif defined(METIS_REAL_64) + +int metis_PartGraphKway_C(idx_t *n, idx_t *ixadj, idx_t *iadj, idx_t *ivwg, + idx_t *iajw, idx_t *nparts, double *weights, + idx_t *graphpart) +{ + int res = -1; + idx_t objval = 0; + idx_t options[METIS_NOPTIONS]; + //printf("Inside Metis/C interface\n"); + idx_t ncon=1; + METIS_SetDefaultOptions(options); + options[METIS_OPTION_NUMBERING] = 1; + //printf("n:%p ncon:%p ixadj:%p iadj:%p npart:%p weights:%p options:%p objval:%p graphpart: %p\n",n,&ncon,ixadj,iadj,nparts,NULL,options,&objval,graphpart); + /* fprintf(stderr,"From metis_int: %f\n",weights[0]); */ + if (weights[0] == -1.0) { + res = METIS_PartGraphKway((idx_t*)n,(idx_t *)&ncon,(idx_t *)ixadj,(idx_t *)iadj, + NULL,NULL,NULL,(idx_t *)nparts,NULL,NULL,options, + &objval,(idx_t *)graphpart); + } else { + /* res = METIS_PartGraphKway((idx_t*)n,(idx_t *)&ncon,(idx_t *)ixadj,(idx_t *)iadj, */ + /* NULL,NULL,NULL,(idx_t *)nparts,NULL,NULL,NULL, */ + /* &objval,(idx_t *)graphpart); */ + res = METIS_PartGraphKway((idx_t*)n,(idx_t *)&ncon,(idx_t *)ixadj,(idx_t *)iadj, + NULL,NULL,NULL,(idx_t *)nparts,weights,NULL,options, + &objval,(idx_t *)graphpart); + } + if (res == METIS_OK) { + return(0); + } else { + return res; + } +} #else @@ -44,3 +79,4 @@ int metis_PartGraphKway_C(idx_t *n, idx_t *ixadj, idx_t *iadj, idx_t *ivwg, return(-1); } #endif +#endif diff --git a/util/psb_metispart_mod.F90 b/util/psb_metispart_mod.F90 index fa6581e9..081d1bc1 100644 --- a/util/psb_metispart_mod.F90 +++ b/util/psb_metispart_mod.F90 @@ -55,7 +55,7 @@ ! module psb_metispart_mod use psb_base_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_, & - & psb_err_unit, psb_spk_,& + & psb_err_unit, psb_spk_, psb_dpk_,& & psb_lsspmat_type, psb_lcspmat_type,& & psb_ldspmat_type, psb_lzspmat_type, & & psb_ls_csr_sparse_mat, psb_ld_csr_sparse_mat, & @@ -72,13 +72,18 @@ module psb_metispart_mod interface psi_build_mtpart subroutine psi_l_build_mtpart(n,ja,irp,nparts,vect, weights) - import :: psb_lpk_, psb_spk_ + import :: psb_lpk_, psb_spk_, psb_dpk_ implicit none integer(psb_lpk_), intent(in) :: n, nparts integer(psb_lpk_), intent(in) :: ja(:), irp(:) integer(psb_lpk_), allocatable, intent(inout) :: vect(:) +#if defined(METIS_REAL_32) real(psb_spk_),optional, intent(in) :: weights(:) - +#elif defined(METIS_REAL_64) + real(psb_dpk_),optional, intent(in) :: weights(:) +#else + choke on me; +#endif end subroutine psi_l_build_mtpart end interface @@ -181,8 +186,13 @@ contains type(psb_ld_csr_sparse_mat), intent(in) :: a integer(psb_lpk_) :: nparts real(psb_dpk_), optional :: weights(:) +#if defined(METIS_REAL_32) real(psb_spk_), allocatable :: wgh_(:) - +#elif defined(METIS_REAL_64) + real(psb_dpk_), allocatable :: wgh_(:) +#else + choke on me; +#endif if (present(weights)) then if (size(weights)==nparts) then @@ -220,8 +230,13 @@ contains type(psb_lz_csr_sparse_mat), intent(in) :: a integer(psb_lpk_) :: nparts real(psb_dpk_), optional :: weights(:) +#if defined(METIS_REAL_32) real(psb_spk_), allocatable :: wgh_(:) - +#elif defined(METIS_REAL_64) + real(psb_dpk_), allocatable :: wgh_(:) +#else + choke on me; +#endif if (present(weights)) then if (size(weights)==nparts) then @@ -276,9 +291,25 @@ contains type(psb_lc_csr_sparse_mat), intent(in) :: a integer(psb_lpk_) :: nparts real(psb_spk_), optional :: weights(:) - - - call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect,weights) +#if defined(METIS_REAL_32) + real(psb_spk_), allocatable :: wgh_(:) +#elif defined(METIS_REAL_64) + real(psb_dpk_), allocatable :: wgh_(:) +#else + choke on me; +#endif + + + if (present(weights)) then + if (size(weights)==nparts) then + wgh_ = weights + end if + end if + if (allocated(wgh_)) then + call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect,wgh_) + else + call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect) + end if end subroutine lc_csr_build_mtpart @@ -288,10 +319,26 @@ contains type(psb_ls_csr_sparse_mat), intent(in) :: a integer(psb_lpk_) :: nparts real(psb_spk_), optional :: weights(:) - - - call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect,weights) +#if defined(METIS_REAL_32) + real(psb_spk_), allocatable :: wgh_(:) +#elif defined(METIS_REAL_64) + real(psb_dpk_), allocatable :: wgh_(:) +#else + choke on me; +#endif + + if (present(weights)) then + if (size(weights)==nparts) then + wgh_ = weights + end if + end if + if (allocated(wgh_)) then + call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect,wgh_) + else + call psi_build_mtpart(a%get_nrows(),a%ja,a%irp,nparts,graph_vect) + end if + end subroutine ls_csr_build_mtpart !