#include <Isorropia_ConfigDefs.hpp>
#include <Isorropia_Epetra.hpp>
#include <Isorropia_EpetraPartitioner.hpp>
#include <Isorropia_EpetraRedistributor.hpp>
#define PRINTLIMIT 5000
#ifdef HAVE_EPETRA
#include <Epetra_Import.h>
#ifdef HAVE_MPI
#include <Epetra_MpiComm.h>
#else
#include <Epetra_SerialComm.h>
#endif
#include <Epetra_MultiVector.h>
#include <Teuchos_CommandLineProcessor.hpp>
#include <Teuchos_RCP.hpp>
#include <string>
#include "ispatest_lbeval_utils.hpp"
#include "ispatest_epetra_utils.hpp"
#ifdef _MSC_VER
#include "winprocess.h"
#endif
int main(int argc, char** argv) {
int fail = 0, dim=0;
int localProc = 0;
int numProcs = 1;
#ifdef HAVE_MPI
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &localProc);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
const Epetra_MpiComm Comm(MPI_COMM_WORLD);
#else
const Epetra_SerialComm Comm;
#endif
if (getenv("DEBUGME")){
std::cerr << localProc << " gdb test_rcb.exe " << getpid() << std::endl;
sleep(15);
}
Teuchos::CommandLineProcessor clp(false,true);
std::string *inputFile = new std::string("simple.coords");
bool verbose = false;
bool rib = false;
clp.setOption( "f", inputFile, "Name of coordinate input file");
clp.setOption( "v", "q", &verbose,
"Display coordinates and weights before and after partitioning.");
clp.setOption( "rib", "rcb", &rib, "Run RIB instead of RCB");
Teuchos::CommandLineProcessor::EParseCommandLineReturn parse_return =
clp.parse(argc,argv);
if( parse_return == Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED){
#ifdef HAVE_MPI
MPI_Finalize();
#endif
return 0;
}
if( parse_return != Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL ) {
#ifdef HAVE_MPI
MPI_Finalize();
#endif
return 1;
}
Epetra_MultiVector *mv = ispatest::file2multivector(Comm, *inputFile);
if (!mv || ((dim = mv->NumVectors()) < 1)){
if (localProc == 0)
std::cerr << "Invalid input file " << *inputFile << std::endl;
exit(1);
}
int vsize = mv->GlobalLength();
if (verbose){
if (vsize < PRINTLIMIT){
ispatest::printMultiVector(*mv, std::cout, "Coordinates",PRINTLIMIT);
}
else{
if (localProc == 0){
std::cerr << "--v requested, but input file is larger than " << PRINTLIMIT << " coordinates." << std::endl;
std::cerr << "Partitioning will be performed but will not be displayed." << std::endl;
verbose = false;
}
}
}
Epetra_MultiVector *wgts = ispatest::makeWeights(mv->Map(), &ispatest::alternateWeights);
Epetra_Vector * &w1 = (*wgts)(0);
if (!wgts || ((dim = wgts->NumVectors()) != 1)){
if (localProc == 0)
std::cout << "can't create weights" << std::endl;
exit(1);
}
if (verbose){
ispatest::printMultiVector(*wgts, std::cout, "Weights",PRINTLIMIT);
}
Teuchos::ParameterList params;
if (rib){
params.set("Partitioning Method", "RIB");
}
else{
Teuchos::ParameterList &sublist = params.sublist("ZOLTAN");
}
Teuchos::RCP<const Epetra_MultiVector> mv_rcp = Teuchos::rcp(mv);
Teuchos::RCP<const Epetra_MultiVector> wgts_rcp = Teuchos::rcp(wgts);
Teuchos::RCP<Isorropia::Epetra::Partitioner> part =
Teuchos::rcp(new Isorropia::Epetra::Partitioner(mv_rcp, wgts_rcp, params));
Isorropia::Epetra::Redistributor rd(part);
Teuchos::RCP<Epetra_MultiVector> new_mv = rd.redistribute(*mv);
if (verbose){
ispatest::printMultiVector(*new_mv, std::cout, "New Coordinates", PRINTLIMIT);
}
Teuchos::RCP<Epetra_MultiVector> new_wgts = rd.redistribute(*wgts);
Epetra_Vector * &new_w1 = (*new_wgts)(0);
if (verbose){
ispatest::printMultiVector(*new_wgts, std::cout, "New Weights", PRINTLIMIT);
}
double min1, min2, max1, max2, avg1, avg2;
double goal = 1.0 / (double)numProcs;
ispatest::compute_balance(*w1, goal, min1, max1, avg1);
if (localProc == 0){
std::cout << "Balance before partitioning: min " ;
std::cout << min1 << " max " << max1 << " average " << avg1 << std::endl;
}
ispatest::compute_balance(*new_w1, goal, min2, max2, avg2);
if (localProc == 0){
std::cout << "Balance after partitioning: min ";
std::cout << min2 << " max " << max2 << " average " << avg2 << std::endl;
}
#ifdef HAVE_MPI
MPI_Finalize();
#endif
return fail;
}
#endif // HAVE_EPETRA