Skip to content

Commit

Permalink
parmetis: Use petsc bitbucket source instead of glaros
Browse files Browse the repository at this point in the history
This is needed as the upstream source is quite unreliable, timing out in
many cases. petsc has an adjusted version of the source.
  • Loading branch information
cheriimoya committed Jul 24, 2024
1 parent db2396c commit fbff98c
Show file tree
Hide file tree
Showing 2 changed files with 279 additions and 17 deletions.
36 changes: 19 additions & 17 deletions pkgs/by-name/pa/parmetis/package.nix
Original file line number Diff line number Diff line change
@@ -1,28 +1,30 @@
{ lib, stdenv
, fetchurl
, cmake
, mpi
{
lib,
stdenv,
fetchFromBitbucket,
cmake,
metis,
mpi,
}:

stdenv.mkDerivation rec {
pname = "parmetis";
version = "4.0.3";
version = "4.0.3-p9";

src = fetchurl {
url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-${version}.tar.gz";
sha256 = "0pvfpvb36djvqlcc3lq7si0c5xpb2cqndjg8wvzg35ygnwqs5ngj";
src = fetchFromBitbucket {
owner = "petsc";
repo = "pkg-parmetis";
rev = "v${version}";
hash = "sha256-r38msBghAn1MXtvkclxv+VOua5aTT/iAxIN/2EnHTeU=";
};

patches = [ ./use-local-gklib.patch ];
nativeBuildInputs = [ cmake ];
buildInputs = [ mpi ];

# metis and GKlib are packaged with distribution
# AUR https://aur.archlinux.org/packages/parmetis/ has reported that
# it easier to build with the included packages as opposed to using the metis
# package. Compilation time is short.
configurePhase = ''
make config metis_path=$PWD/metis gklib_path=$PWD/metis/GKlib prefix=$out
'';
enableParallelBuilding = true;
buildInputs = [
mpi
metis
];

meta = with lib; {
description = "MPI-based parallel library that implements a variety of algorithms for partitioning unstructured graphs, meshes, and for computing fill-reducing orderings of sparse matrices";
Expand Down
260 changes: 260 additions & 0 deletions pkgs/by-name/pa/parmetis/use-local-gklib.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 911a32d..c55ff11 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 2.8)
project(ParMETIS C)

-set(GKLIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/metis/GKlib CACHE PATH "path to GKlib")
-set(METIS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/metis CACHE PATH "path to METIS")
+set(GKLIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/headers CACHE PATH "path to GKlib")
+set(METIS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/headers CACHE PATH "path to METIS")

# Search for MPI.
# GK commented this out as it seems to be creating problems
diff --git a/headers/gk_externs.h b/headers/gk_externs.h
index e63f2ab..c31b3a7 100644
--- a/headers/gk_externs.h
+++ b/headers/gk_externs.h
@@ -14,16 +14,11 @@
/*************************************************************************
* Extern variable definition. Hopefully, the __thread makes them thread-safe.
**************************************************************************/
-
-/* include the definition of metis__thread; it is assumed that
- gklib_tls.h will be installed 'globally' i.e. into $PREFIX */
-#include <gklib_tls.h>
-
#ifndef _GK_ERROR_C_
/* declared in error.c */
-extern metis__thread int gk_cur_jbufs;
-extern metis__thread jmp_buf gk_jbufs[];
-extern metis__thread jmp_buf gk_jbuf;
+extern __thread int gk_cur_jbufs;
+extern __thread jmp_buf gk_jbufs[];
+extern __thread jmp_buf gk_jbuf;

#endif

diff --git a/headers/gklib_defs.h b/headers/gklib_defs.h
new file mode 100644
index 0000000..dfac5ca
--- /dev/null
+++ b/headers/gklib_defs.h
@@ -0,0 +1,53 @@
+/*!
+\file
+\brief Data structures and prototypes for GKlib integration
+
+\date Started 12/23/2008
+\author George
+\version\verbatim $Id: gklib_defs.h 10395 2011-06-23 23:28:06Z karypis $ \endverbatim
+*/
+
+#ifndef _LIBMETIS_GKLIB_H_
+#define _LIBMETIS_GKLIB_H_
+
+#include "gklib_rename.h"
+
+/*************************************************************************/
+/*! Stores a weighted edge */
+/*************************************************************************/
+typedef struct {
+ idx_t u, v, w; /*!< Edge (u,v) with weight w */
+} uvw_t;
+
+/*************************************************************************
+* Define various data structure using GKlib's templates.
+**************************************************************************/
+GK_MKKEYVALUE_T(ikv_t, idx_t, idx_t)
+GK_MKKEYVALUE_T(rkv_t, real_t, idx_t)
+GK_MKPQUEUE_T(ipq_t, ikv_t)
+GK_MKPQUEUE_T(rpq_t, rkv_t)
+
+
+/* gklib.c */
+GK_MKBLAS_PROTO(i, idx_t, idx_t)
+GK_MKBLAS_PROTO(r, real_t, real_t)
+GK_MKALLOC_PROTO(i, idx_t)
+GK_MKALLOC_PROTO(r, real_t)
+GK_MKALLOC_PROTO(ikv, ikv_t)
+GK_MKALLOC_PROTO(rkv, rkv_t)
+GK_MKPQUEUE_PROTO(ipq, ipq_t, idx_t, idx_t)
+GK_MKPQUEUE_PROTO(rpq, rpq_t, real_t, idx_t)
+GK_MKRANDOM_PROTO(i, idx_t, idx_t)
+GK_MKARRAY2CSR_PROTO(i, idx_t)
+void isorti(size_t n, idx_t *base);
+void isortd(size_t n, idx_t *base);
+void rsorti(size_t n, real_t *base);
+void rsortd(size_t n, real_t *base);
+void ikvsorti(size_t n, ikv_t *base);
+void ikvsortii(size_t n, ikv_t *base);
+void ikvsortd(size_t n, ikv_t *base);
+void rkvsorti(size_t n, rkv_t *base);
+void rkvsortd(size_t n, rkv_t *base);
+void uvwsorti(size_t n, uvw_t *base);
+
+#endif
diff --git a/headers/gklib_rename.h b/headers/gklib_rename.h
new file mode 100644
index 0000000..78dc8b3
--- /dev/null
+++ b/headers/gklib_rename.h
@@ -0,0 +1,122 @@
+/*!
+\file
+
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * This file contains header files
+ *
+ * Started 10/2/97
+ * George
+ *
+ * $Id: gklib_rename.h 10395 2011-06-23 23:28:06Z karypis $
+ *
+ */
+
+
+#ifndef _LIBMETIS_GKLIB_RENAME_H_
+#define _LIBMETIS_GKLIB_RENAME_H_
+
+/* gklib.c - generated from the .o files using the ./utils/listundescapedsumbols.csh */
+#define iAllocMatrix libmetis__iAllocMatrix
+#define iFreeMatrix libmetis__iFreeMatrix
+#define iSetMatrix libmetis__iSetMatrix
+#define iargmax libmetis__iargmax
+#define iargmax_n libmetis__iargmax_n
+#define iargmin libmetis__iargmin
+#define iarray2csr libmetis__iarray2csr
+#define iaxpy libmetis__iaxpy
+#define icopy libmetis__icopy
+#define idot libmetis__idot
+#define iincset libmetis__iincset
+#define ikvAllocMatrix libmetis__ikvAllocMatrix
+#define ikvFreeMatrix libmetis__ikvFreeMatrix
+#define ikvSetMatrix libmetis__ikvSetMatrix
+#define ikvcopy libmetis__ikvcopy
+#define ikvmalloc libmetis__ikvmalloc
+#define ikvrealloc libmetis__ikvrealloc
+#define ikvset libmetis__ikvset
+#define ikvsmalloc libmetis__ikvsmalloc
+#define ikvsortd libmetis__ikvsortd
+#define ikvsorti libmetis__ikvsorti
+#define ikvsortii libmetis__ikvsortii
+#define imalloc libmetis__imalloc
+#define imax libmetis__imax
+#define imin libmetis__imin
+#define inorm2 libmetis__inorm2
+#define ipqCheckHeap libmetis__ipqCheckHeap
+#define ipqCreate libmetis__ipqCreate
+#define ipqDelete libmetis__ipqDelete
+#define ipqDestroy libmetis__ipqDestroy
+#define ipqFree libmetis__ipqFree
+#define ipqGetTop libmetis__ipqGetTop
+#define ipqInit libmetis__ipqInit
+#define ipqInsert libmetis__ipqInsert
+#define ipqLength libmetis__ipqLength
+#define ipqReset libmetis__ipqReset
+#define ipqSeeKey libmetis__ipqSeeKey
+#define ipqSeeTopKey libmetis__ipqSeeTopKey
+#define ipqSeeTopVal libmetis__ipqSeeTopVal
+#define ipqUpdate libmetis__ipqUpdate
+#define isrand libmetis__isrand
+#define irand libmetis__irand
+#define irandArrayPermute libmetis__irandArrayPermute
+#define irandArrayPermuteFine libmetis__irandArrayPermuteFine
+#define irandInRange libmetis__irandInRange
+#define irealloc libmetis__irealloc
+#define iscale libmetis__iscale
+#define iset libmetis__iset
+#define ismalloc libmetis__ismalloc
+#define isortd libmetis__isortd
+#define isorti libmetis__isorti
+#define isrand libmetis__isrand
+#define isum libmetis__isum
+#define rAllocMatrix libmetis__rAllocMatrix
+#define rFreeMatrix libmetis__rFreeMatrix
+#define rSetMatrix libmetis__rSetMatrix
+#define rargmax libmetis__rargmax
+#define rargmax_n libmetis__rargmax_n
+#define rargmin libmetis__rargmin
+#define raxpy libmetis__raxpy
+#define rcopy libmetis__rcopy
+#define rdot libmetis__rdot
+#define rincset libmetis__rincset
+#define rkvAllocMatrix libmetis__rkvAllocMatrix
+#define rkvFreeMatrix libmetis__rkvFreeMatrix
+#define rkvSetMatrix libmetis__rkvSetMatrix
+#define rkvcopy libmetis__rkvcopy
+#define rkvmalloc libmetis__rkvmalloc
+#define rkvrealloc libmetis__rkvrealloc
+#define rkvset libmetis__rkvset
+#define rkvsmalloc libmetis__rkvsmalloc
+#define rkvsortd libmetis__rkvsortd
+#define rkvsorti libmetis__rkvsorti
+#define rmalloc libmetis__rmalloc
+#define rmax libmetis__rmax
+#define rmin libmetis__rmin
+#define rnorm2 libmetis__rnorm2
+#define rpqCheckHeap libmetis__rpqCheckHeap
+#define rpqCreate libmetis__rpqCreate
+#define rpqDelete libmetis__rpqDelete
+#define rpqDestroy libmetis__rpqDestroy
+#define rpqFree libmetis__rpqFree
+#define rpqGetTop libmetis__rpqGetTop
+#define rpqInit libmetis__rpqInit
+#define rpqInsert libmetis__rpqInsert
+#define rpqLength libmetis__rpqLength
+#define rpqReset libmetis__rpqReset
+#define rpqSeeKey libmetis__rpqSeeKey
+#define rpqSeeTopKey libmetis__rpqSeeTopKey
+#define rpqSeeTopVal libmetis__rpqSeeTopVal
+#define rpqUpdate libmetis__rpqUpdate
+#define rrealloc libmetis__rrealloc
+#define rscale libmetis__rscale
+#define rset libmetis__rset
+#define rsmalloc libmetis__rsmalloc
+#define rsortd libmetis__rsortd
+#define rsorti libmetis__rsorti
+#define rsum libmetis__rsum
+#define uvwsorti libmetis__uvwsorti
+
+#endif
+
+
diff --git a/libparmetis/parmetislib.h b/libparmetis/parmetislib.h
index 0f2ed89..993f108 100644
--- a/libparmetis/parmetislib.h
+++ b/libparmetis/parmetislib.h
@@ -16,11 +16,11 @@
#define DMALLOC 1
*/

-#include <GKlib.h>
+#include "GKlib.h"

#include <parmetis.h>

-#include <gklib_defs.h>
+#include "gklib_defs.h"

#include <mpi.h>

diff --git a/programs/parmetisbin.h b/programs/parmetisbin.h
index 6590087..80eec81 100644
--- a/programs/parmetisbin.h
+++ b/programs/parmetisbin.h
@@ -16,9 +16,9 @@
#define DMALLOC 1
*/

-#include <GKlib.h>
+#include "GKlib.h"
#include <parmetis.h>
-#include <gklib_defs.h>
+#include "gklib_defs.h"

#include "../libparmetis/rename.h"
#include "../libparmetis/defs.h"

0 comments on commit fbff98c

Please sign in to comment.