Commit 40282439 authored by David Moxey's avatar David Moxey

Start to tidy up branch and sort out default partitioning strategy

parent 7b471dc0
......@@ -354,17 +354,21 @@ INSTALL(FILES ${CMAKE_BINARY_DIR}/Nektar++Config.cmake
COMPONENT dev)
# Install ThirdParty headers to subdirectory of ${NEKTAR_INCLUDE_DIR}
INSTALL(DIRECTORY ${TPDIST}/include/
DESTINATION ${NEKTAR_INCLUDE_DIR}/ThirdParty
COMPONENT dev
)
IF (EXISTS ${TPDIST}/include)
INSTALL(DIRECTORY ${TPDIST}/include/
DESTINATION ${NEKTAR_INCLUDE_DIR}/ThirdParty
COMPONENT dev
)
ENDIF()
# Install ThirdParty libraries into ${NEKTAR_LIB_DIR}. These are shipped with
# the LibUtilities library.
INSTALL(DIRECTORY ${TPDIST}/lib/
DESTINATION ${NEKTAR_LIB_DIR}
COMPONENT libutilities
)
IF (EXISTS ${TPDIST}/lib)
INSTALL(DIRECTORY ${TPDIST}/lib/
DESTINATION ${NEKTAR_LIB_DIR}
COMPONENT libutilities
)
ENDIF()
ADD_SUBDIRECTORY(docs)
......
......@@ -77,6 +77,13 @@ IF( NEKTAR_USE_SCOTCH )
${NEKTAR++_TP_INCLUDE_DIRS} ${SCOTCH_INCLUDE_DIRS})
ENDIF( NEKTAR_USE_SCOTCH )
SET(NEKTAR_USE_METIS "@NEKTAR_USE_METIS@")
IF( NEKTAR_USE_METOS )
SET(METIS_INCLUDE_DIRS "@METIS_CONFIG_INCLUDE_DIR@")
SET(NEKTAR++_TP_INCLUDE_DIRS
${NEKTAR++_TP_INCLUDE_DIRS} ${METIS_INCLUDE_DIRS})
ENDIF( NEKTAR_USE_METIS )
SET(NEKTAR_USE_FFTW "@NEKTAR_USE_FFTW@")
IF( NEKTAR_USE_FFTW )
SET(FFTW_INCLUDE_DIR "@FFTW_INCLUDE_DIR@")
......
......@@ -68,18 +68,14 @@ IF( NEKTAR_USE_MPI )
-DCMAKE_INSTALL_PREFIX:PATH=${TPDIST}
${TPSRC}/gsmpi-1.2.1
)
SET(GSMPI_LIBRARY gsmpi CACHE FILEPATH
"GSMPI path" FORCE)
THIRDPARTY_LIBRARY(GSMPI_LIBRARY STATIC gsmpi DESCRIPTION "GSMPI Library")
THIRDPARTY_LIBRARY(XXT_LIBRARY STATIC xxt DESCRIPTION "XXT Library")
MARK_AS_ADVANCED(GSMPI_LIBRARY)
SET(XXT_LIBRARY xxt CACHE FILEPATH
"XXT path" FORCE)
MARK_AS_ADVANCED(XXT_LIBRARY)
MESSAGE(STATUS "Build GSMPI: ${TPDIST}/lib/lib${GSMPI_LIBRARY}.a")
MESSAGE(STATUS "Build XXT: ${TPDIST}/lib/lib${XXT_LIBRARY}.a")
MESSAGE(STATUS "Build GSMPI: ${GSMPI_LIBRARY}")
MESSAGE(STATUS "Build XXT: ${XXT_LIBRARY}")
ELSE (THIRDPARTY_BUILD_GSMPI)
ADD_CUSTOM_TARGET(gsmpi-1.2.1 ALL)
INCLUDE (FindGSMPI)
INCLUDE (FindXXT)
MESSAGE(FATAL_ERROR "Must build GSMPI and XXT")
ENDIF (THIRDPARTY_BUILD_GSMPI)
ENDIF( NEKTAR_USE_MPI )
......@@ -8,40 +8,61 @@
INCLUDE(ExternalProject)
EXTERNALPROJECT_ADD(
modmetis-5.1.0
PREFIX ${TPSRC}
URL ${TPURL}/modmetis-5.1.0_2.tar.bz2
URL_MD5 "8a1f1afd39b46a4477c1ea15464cdf89"
STAMP_DIR ${TPBUILD}/stamp
DOWNLOAD_DIR ${TPSRC}
SOURCE_DIR ${TPSRC}/modmetis-5.1.0
BINARY_DIR ${TPBUILD}/modmetis-5.1.0
TMP_DIR ${TPBUILD}/modmetis-5.1.0-tmp
INSTALL_DIR ${TPDIST}
CONFIGURE_COMMAND ${CMAKE_COMMAND}
-G ${CMAKE_GENERATOR}
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
-DCMAKE_INSTALL_PREFIX:PATH=${TPDIST}
-DCMAKE_C_FLAGS:STRING=-fPIC\ -w
-DGKLIB_PATH:PATH=${TPSRC}/modmetis-5.1.0/GKlib
${TPSRC}/modmetis-5.1.0
)
IF (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# Clang 7.3 has a lovely bug that needs to be patched in order for it to
# compile.
IF (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "7.3")
EXTERNALPROJECT_ADD_STEP(modmetis-5.1.0 patch-install-path
COMMAND sed -i ".bak" "s|#define MAX_JBUFS 128|#define MAX_JBUFS 24|" ${TPSRC}/modmetis-5.1.0/GKlib/error.c
DEPENDERS build
DEPENDEES download)
ENDIF()
ENDIF()
OPTION(NEKTAR_USE_METIS
"Use Metis library for performing mesh partitioning." OFF)
IF (NEKTAR_USE_METIS)
FIND_LIBRARY(METIS_LIBRARY NAMES metis PATHS ${MACPORTS_PREFIX}/lib)
FIND_PATH (METIS_INCLUDE_DIR metis.h PATHS ${MACPORTS_PREFIX}/include)
IF (METIS_LIBRARY AND METIS_INCLUDE_DIR)
SET(BUILD_METIS OFF)
ELSE()
SET(BUILD_METIS ON)
ENDIF ()
CMAKE_DEPENDENT_OPTION(THIRDPARTY_BUILD_METIS
"Build Metis library from ThirdParty" ${BUILD_METIS}
"NEKTAR_USE_METIS" OFF)
THIRDPARTY_LIBRARY(METIS_LIB STATIC metis DESCRIPTION "Metis library")
MARK_AS_ADVANCED(METIS_LIB)
MESSAGE(STATUS "Build Metis: ${METIS_LIB}")
IF (THIRDPARTY_BUILD_METIS)
EXTERNALPROJECT_ADD(
metis-5.1.0
PREFIX ${TPSRC}
URL ${TPURL}/metis-5.1.0.tar.gz
URL_MD5 "5465e67079419a69e0116de24fce58fe"
STAMP_DIR ${TPBUILD}/stamp
DOWNLOAD_DIR ${TPSRC}
SOURCE_DIR ${TPSRC}/metis-5.1.0
BINARY_DIR ${TPBUILD}/metis-5.1.0
TMP_DIR ${TPBUILD}/metis-5.1.0-tmp
INSTALL_DIR ${TPDIST}
CONFIGURE_COMMAND ${CMAKE_COMMAND}
-G ${CMAKE_GENERATOR}
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
-DCMAKE_INSTALL_PREFIX:PATH=${TPDIST}
-DCMAKE_C_FLAGS:STRING=-fPIC\ -w
-DGKLIB_PATH:PATH=${TPSRC}/metis-5.1.0/GKlib
${TPSRC}/metis-5.1.0
)
INCLUDE_DIRECTORIES(${TPDIST}/include)
\ No newline at end of file
IF (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# Clang 7.3 has a lovely bug that needs to be patched in order for it to
# compile.
IF (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "7.3")
EXTERNALPROJECT_ADD_STEP(metis-5.1.0 patch-install-path
COMMAND sed -i ".bak" "s|#define MAX_JBUFS 128|#define MAX_JBUFS 24|" ${TPSRC}/metis-5.1.0/GKlib/error.c
DEPENDERS build
DEPENDEES download)
ENDIF()
ENDIF()
THIRDPARTY_LIBRARY(METIS_LIB STATIC metis DESCRIPTION "Metis library")
MARK_AS_ADVANCED(METIS_LIB)
MESSAGE(STATUS "Build Metis: ${METIS_LIB}")
SET(METIS_CONFIG_INCLUDE_DIR ${TPINC})
INCLUDE_DIRECTORIES(${TPDIST}/include)
ENDIF()
ENDIF()
\ No newline at end of file
......@@ -8,14 +8,14 @@
IF (NOT WIN32)
OPTION(NEKTAR_USE_SCOTCH
"Use Scotch library for performing mesh partitioning." OFF)
"Use Scotch library for performing mesh partitioning." ON)
ENDIF(NOT WIN32)
IF (NEKTAR_USE_SCOTCH)
# First search for system TinyXML installs. Hint /opt/local for MacPorts.
FIND_LIBRARY(SCOTCH_LIBRARY NAMES scotch PATHS /opt/local/lib)
FIND_LIBRARY(SCOTCHERR_LIBRARY NAMES scotcherr PATHS /opt/local/lib)
FIND_PATH (SCOTCH_INCLUDE_DIR scotch.h PATHS /opt/local/include)
FIND_LIBRARY(SCOTCH_LIBRARY NAMES scotch PATHS ${MACPORTS_PREFIX}/lib)
FIND_LIBRARY(SCOTCHERR_LIBRARY NAMES scotcherr PATHS ${MACPORTS_PREFIX}/lib)
FIND_PATH (SCOTCH_INCLUDE_DIR scotch.h PATHS ${MACPORTS_PREFIX}/include)
IF (SCOTCH_LIBRARY AND SCOTCHERR_LIBRARY AND SCOTCH_INCLUDE_DIR)
SET(BUILD_SCOTCH OFF)
......@@ -38,7 +38,7 @@ IF (NEKTAR_USE_SCOTCH)
# Note that scotch is compiled in the source-tree, so we unpack the
# source code in the ThirdParty builds directory.
SET(SCOTCH_SRC ${TPBUILD}/scotch-6.0.0/src)
SET(SCOTCH_SRC ${TPBUILD}/scotch-6.0.4/src)
IF (APPLE)
SET(SCOTCH_MAKE Makefile.inc.i686_mac_darwin8)
......@@ -57,15 +57,15 @@ IF (NEKTAR_USE_SCOTCH)
INCLUDE(ExternalProject)
EXTERNALPROJECT_ADD(
scotch-6.0.0
scotch-6.0.4
PREFIX ${TPSRC}
URL ${TPURL}/scotch_6.0.0.tar.gz
URL_MD5 "ba117428c0a6cd97d0c93e8b872bb3fe"
URL ${TPURL}/scotch_6.0.4.tar.gz
URL_MD5 "d58b825eb95e1db77efe8c6ff42d329f"
STAMP_DIR ${TPBUILD}/stamp
DOWNLOAD_DIR ${TPSRC}
SOURCE_DIR ${TPBUILD}/scotch-6.0.0
BINARY_DIR ${TPBUILD}/scotch-6.0.0
TMP_DIR ${TPBUILD}/scotch-6.0.0-tmp
SOURCE_DIR ${TPBUILD}/scotch-6.0.4
BINARY_DIR ${TPBUILD}/scotch-6.0.4
TMP_DIR ${TPBUILD}/scotch-6.0.4-tmp
INSTALL_DIR ${TPDIST}
CONFIGURE_COMMAND rm -f ${SCOTCH_SRC}/Makefile.inc
COMMAND ln -s
......@@ -88,7 +88,7 @@ IF (NEKTAR_USE_SCOTCH)
MESSAGE(STATUS "Build Scotch: ${SCOTCH_LIBRARY}")
SET(SCOTCH_CONFIG_INCLUDE_DIR ${TPINC})
ELSE (THIRDPARTY_BUILD_SCOTCH)
ADD_CUSTOM_TARGET(scotch-6.0.0 ALL)
ADD_CUSTOM_TARGET(scotch-6.0.4 ALL)
MESSAGE(STATUS "Found Scotch: ${SCOTCH_LIBRARY}")
SET(SCOTCH_CONFIG_INCLUDE_DIR ${SCOTCH_INCLUDE_DIR})
ENDIF (THIRDPARTY_BUILD_SCOTCH)
......
......@@ -1344,7 +1344,7 @@ namespace Nektar
}
}
// Call Metis and partition graph
// Call partitioner to partition graph
int vol = 0;
try
......@@ -1354,10 +1354,10 @@ namespace Nektar
// so there is no doubt the partitions are all the same in all the columns
if(m_comm->GetColumnComm()->GetRank() == 0)
{
// Attempt partitioning using METIS.
// Attempt partitioning.
PartitionGraphImpl(nGraphVerts, ncon, xadj, adjncy, vwgt, vsize, adjwgt, nParts, vol, part);
// Check METIS produced a valid partition and fix if not.
// Check the partitioner produced a valid partition and fix if not.
CheckPartitions(nParts, part);
if (!m_shared)
{
......@@ -1387,7 +1387,7 @@ namespace Nektar
catch (...)
{
NEKERROR(ErrorUtil::efatal,
"Error in calling metis to partition graph.");
"Error in calling graph partiitioner.");
}
}
else
......@@ -1449,11 +1449,11 @@ namespace Nektar
}
}
// If METIS produced an invalid partition, repartition naively.
// Elements are assigned to processes in a round-robin fashion.
// It is assumed that METIS failure only occurs when the number of
// elements is approx. the number of processes, so this approach
// should not be too inefficient communication-wise.
// If the partitioner produced an invalid partition, repartition
// naively. Elements are assigned to processes in a round-robin
// fashion. It is assumed that partitioner failure only occurs when
// the number of elements is approx. the number of processes, so
// this approach should not be too inefficient communication-wise.
if (!valid)
{
for (i = 0; i < pPart.num_elements(); ++i)
......
......@@ -32,14 +32,15 @@
// Description: Scotch partitioner interface
//
///////////////////////////////////////////////////////////////////////////////
#ifndef NEKTAR_LIB_UTILITIES_MESHPARTITIONMETIS_H
#define NEKTAR_LIB_UTILITIES_MESHPARTITIONMETIS_H
#ifndef NEKTAR_LIB_UTILITIES_MESHPARTITIONSCOTCH_H
#define NEKTAR_LIB_UTILITIES_MESHPARTITIONSCOTCH_H
#include "LibUtilities/Memory/NekMemoryManager.hpp"
#include "MeshPartition.h"
#include "scotch.h"
#include <scotch.h>
namespace Nektar
{
......
......@@ -39,36 +39,11 @@
#include <LibUtilities/BasicConst/NektarUnivTypeDefs.hpp>
#include <LibUtilities/BasicUtils/SharedArray.hpp>
#include "metis.h"
#include <metis.h>
namespace Metis
{
extern "C"
{
void AS_METIS_NodeND(int *nVerts, int *xadj, int *adjncy, int *vwgt,
int *options, int *perm, int *iperm, int *map,
int *mdswitch);
}
inline static void as_onmetis(
int nVerts,
Nektar::Array<Nektar::OneD, int> xadj,
Nektar::Array<Nektar::OneD, int> adjncy,
Nektar::Array<Nektar::OneD, int> perm,
Nektar::Array<Nektar::OneD, int> iperm,
Nektar::Array<Nektar::OneD, int> map,
int mdswitch = 1)
{
ASSERTL1(xadj.num_elements() == nVerts+1,"Array xadj out of bounds");
ASSERTL1(perm.num_elements() == nVerts,"Array perm out of bounds");
ASSERTL1(iperm.num_elements() == nVerts,"Array iperm out of bounds");
AS_METIS_NodeND(&nVerts, &xadj[0], &adjncy[0], NULL, NULL, &perm[0],
&iperm[0], &map[0], &mdswitch);
}
inline static void PartGraphVKway(
inline static void PartGraphVKway(
int& nVerts,
int& nVertConds,
Nektar::Array<Nektar::OneD, int>& xadj,
......
///////////////////////////////////////////////////////////////////////////////
//
// File Scotch.hpp
//
// For more information, please see: http://www.nektar.info
//
// The MIT License
//
// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
// Department of Aeronautics, Imperial College London (UK), and Scientific
// Computing and Imaging Institute, University of Utah (USA).
//
// License for the specific language governing rights and limitations under
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// Description: wrapper of functions around Scotch routines
//
///////////////////////////////////////////////////////////////////////////////
#ifndef NEKTAR_LIB_UTILITIES_BASICUTILS_SCOTCH_HPP
#define NEKTAR_LIB_UTILITIES_BASICUTILS_SCOTCH_HPP
namespace Scotch
{
extern "C" {
// Scotch version of old metis call
void METIS_PartGraphVKway(int *nVerts, int *xadj, int *adjcy,
int *vertWgt, int *vertSize,
int *wgtFlag, int *numflag, int *nparts,
int *options, int *volume, int *part);
}
inline static void PartGraphVKway(
int& nVerts,
int& nVertConds,
Nektar::Array<Nektar::OneD, int>& xadj,
Nektar::Array<Nektar::OneD, int>& adjcy,
Nektar::Array<Nektar::OneD, int>& vertWgt,
Nektar::Array<Nektar::OneD, int>& vertSize,
int& nparts,
int& volume,
Nektar::Array<Nektar::OneD, int>& part)
{
int wgtflag = 0;
int *vwgt = 0;
int *vsize = 0;
if (vertWgt.num_elements() > 0)
{
wgtflag += 1;
vwgt = &vertWgt[0];
}
if (vertSize.num_elements() > 0)
{
wgtflag += 2;
vsize = &vertSize[0];
}
int numflag = 0;
// number of balancing conditions (size of vertex multi-weight)
int options[5];
options[0] = 0;
//METIS_SetDefaultOptions(options);
METIS_PartGraphVKway(&nVerts, &xadj[0], &adjcy[0], vwgt, vsize,
&wgtflag, &numflag, &nparts, options, &volume,
&part[0]);
}
}
......@@ -1618,13 +1618,13 @@ namespace Nektar
return;
}
// Default partitioner to use is Metis. Use Scotch as default
// Default partitioner to use is Scotch. Use Metis as default
// if it is installed. Override default with command-line flags
// if they are set.
string vPartitionerName = "Metis";
if (GetMeshPartitionFactory().ModuleExists("Scotch"))
string vPartitionerName = "Scotch";
if (GetMeshPartitionFactory().ModuleExists("Metis"))
{
vPartitionerName = "Scotch";
vPartitionerName = "Metis";
}
if (DefinesCmdLineArgument("use-metis"))
{
......
......@@ -18,7 +18,6 @@ SET(BasicUtilsHeaders
./BasicUtils/HashUtils.hpp
./BasicUtils/MeshEntities.hpp
./BasicUtils/MeshPartition.h
./BasicUtils/MeshPartitionMetis.h
./BasicUtils/NekManager.hpp
./BasicUtils/NekFactory.hpp
./BasicUtils/OperatorGenerators.hpp
......@@ -35,7 +34,6 @@ SET(BasicUtilsHeaders
./BasicUtils/ThreadBoost.h
./BasicUtils/Vmath.hpp
./BasicUtils/VmathArray.hpp
./BasicUtils/Metis.hpp
./BasicUtils/VtkUtil.hpp
)
......@@ -48,7 +46,6 @@ SET(BasicUtilsSources
./BasicUtils/FieldIOXml.cpp
./BasicUtils/FileSystem.cpp
./BasicUtils/MeshPartition.cpp
./BasicUtils/MeshPartitionMetis.cpp
./BasicUtils/ParseUtils.cpp
./BasicUtils/PtsField.cpp
./BasicUtils/PtsIO.cpp
......@@ -69,6 +66,7 @@ IF( NEKTAR_USE_HDF5 )
./BasicUtils/FieldIOHdf5.cpp)
ENDIF( NEKTAR_USE_HDF5 )
SET(CommunicationHeaders
./Communication/Comm.h
./Communication/CommSerial.h
......@@ -85,6 +83,14 @@ SET(CommunicationSources
./Communication/Transposition.cpp
)
IF(NEKTAR_USE_METIS)
SET(BasicUtilsHeaders ${BasicUtilsHeaders}
./BasicUtils/MeshPartitionMetis.h
./BasicUtils/Metis.hpp)
SET(BasicUtilsSources ${BasicUtilsSources}
./BasicUtils/MeshPartitionMetis.cpp)
ENDIF()
IF(NEKTAR_USE_SCOTCH)
SET(BasicUtilsHeaders ${BasicUtilsHeaders}
./BasicUtils/MeshPartitionScotch.h)
......@@ -349,19 +355,22 @@ ADD_NEKTAR_LIBRARY(LibUtilities
SUMMARY "Nektar++ LibUtilities library"
DESCRIPTION "This library provides core routines including linear algebra and integration with ThirdParty libraries.")
ADD_DEPENDENCIES(LibUtilities modmetis-5.1.0 boost tinyxml-2.6.2 zlib-1.2.7)
ADD_DEPENDENCIES(LibUtilities boost tinyxml-2.6.2 zlib-1.2.7)
### Libraries needed specifically by LibUtilities ###
### Static libraries do not need to be linked by
# Scotch
IF( NEKTAR_USE_SCOTCH )
IF (NEKTAR_USE_SCOTCH)
TARGET_LINK_LIBRARIES(LibUtilities LINK_PUBLIC
${SCOTCH_LIBRARY} ${SCOTCHERR_LIBRARY})
ADD_DEPENDENCIES(LibUtilities scotch-6.0.0)
ENDIF ()
ADD_DEPENDENCIES(LibUtilities scotch-6.0.4)
ENDIF()
# Metis
TARGET_LINK_LIBRARIES(LibUtilities LINK_PRIVATE ${METIS_LIB})
IF (NEKTAR_USE_METIS)
TARGET_LINK_LIBRARIES(LibUtilities LINK_PRIVATE ${METIS_LIB})
ADD_DEPENDENCIES(LibUtilities metis-5.1.0)
ENDIF()
# FFTW
IF( NEKTAR_USE_FFTW )
......
......@@ -137,9 +137,6 @@ ADD_NEKTAR_LIBRARY(MultiRegions
SUMMARY "Nektar++ MultiRegions library"
DESCRIPTION "This library provides global expansions on multi-element domains.")
# MultiRegions uses additional routines from Metis
TARGET_LINK_LIBRARIES(MultiRegions LINK_PRIVATE ${METIS_LIB})
# MultiRegions uses additional routines from GSMPI
IF( NEKTAR_USE_MPI )
TARGET_LINK_LIBRARIES(MultiRegions LINK_PRIVATE ${GSMPI_LIBRARY} ${XXT_LIBRARY})
......
......@@ -929,8 +929,8 @@ namespace Nektar
&cblknbr, &rangtab[0], &treetab[0]));
// We're now done with Scotch: clean up the created structures.
SCOTCH_CALL(SCOTCH_graphOrderExit, (&scGraph));
SCOTCH_CALL(SCOTCH_stratExit, (&strat));
SCOTCH_graphExit(&scGraph);
SCOTCH_stratExit(&strat);
//
// Step 3: create a MultiLevelBisectedGraph by reading the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment