Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // @HEADER
- //
- // ***********************************************************************
- //
- // Zoltan2: A package of combinatorial algorithms for scientific computing
- // Copyright 2012 Sandia Corporation
- //
- // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
- // the U.S. Government retains certain rights in this software.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // 1. Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- //
- // 2. Redistributions in binary form must reproduce the above copyright
- // notice, this list of conditions and the following disclaimer in the
- // documentation and/or other materials provided with the distribution.
- //
- // 3. Neither the name of the Corporation nor the names of the
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
- // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
- // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Questions? Contact Karen Devine (kddevin@sandia.gov)
- // Erik Boman (egboman@sandia.gov)
- // Siva Rajamanickam (srajama@sandia.gov)
- //
- // ***********************************************************************
- //
- // @HEADER
- /*! \file rcb_C.cpp
- \brief An example of partitioning coordinates with RCB.
- */
- #include <Zoltan2_PartitioningSolution.hpp>
- #include <Zoltan2_PartitioningProblem.hpp>
- #include <Zoltan2_BasicVectorAdapter.hpp>
- #include <Zoltan2_InputTraits.hpp>
- #include <Tpetra_Map.hpp>
- #include <vector>
- #include <cstdlib>
- #include "mpi.h"
- using namespace std;
- using std::vector;
- using Teuchos::RCP;
- /*! \example rcb_C.cpp
- An example of the use of the RCB algorithm to partition coordinate data.
- */
- int main(int argc, char *argv[])
- {
- MPI_Init(&argc, &argv);
- int rank, nprocs;
- MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- // For convenience, we'll use the Tpetra defaults for local/global ID types
- // Users can substitute their preferred local/global ID types
- typedef Tpetra::Map<> Map_t;
- typedef Map_t::local_ordinal_type localId_t;
- typedef Map_t::global_ordinal_type globalId_t;
- typedef double scalar_t;
- typedef Zoltan2::BasicUserTypes<scalar_t, localId_t, globalId_t> myTypes;
- // TODO explain
- typedef Zoltan2::BasicVectorAdapter<myTypes> inputAdapter_t;
- typedef Zoltan2::EvaluatePartition<inputAdapter_t> quality_t;
- typedef inputAdapter_t::part_t part_t;
- typedef inputAdapter_t::base_adapter_t base_adapter_t;
- ///////////////////////////////////////////////////////////////////////
- // Create input data.
- size_t totalCount = 15000000;
- size_t localCount = totalCount/nprocs;
- int dim = 3;
- scalar_t *coords = new scalar_t [dim * localCount];
- scalar_t *x = coords;
- scalar_t *y = x + localCount;
- scalar_t *z = y + localCount;
- // Create coordinates that range from 0 to 10.0
- srand(rank);
- scalar_t scalingFactor = 10.0 / RAND_MAX;
- for (size_t i=0; i < localCount*dim; i++){
- coords[i] = scalar_t(rand()) * scalingFactor;
- }
- // Create global ids for the coordinates.
- globalId_t *globalIds = new globalId_t [localCount];
- globalId_t offset = rank * localCount;
- for (size_t i=0; i < localCount; i++)
- globalIds[i] = offset++;
- ///////////////////////////////////////////////////////////////////////
- // Create parameters for an RCB problem
- double tolerance = 1.5;
- if (rank == 0)
- std::cout << "Imbalance tolerance is " << tolerance << std::endl;
- Teuchos::ParameterList params("test params");
- params.set("debug_level", "basic_status");
- params.set("debug_procs", "0");
- params.set("error_check_level", "debug_mode_assertions");
- params.set("algorithm", "rcb");
- params.set("imbalance_tolerance", tolerance );
- params.set("num_global_parts", 2048);
- ///////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // A simple problem with no weights.
- ///////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // Create a Zoltan2 input adapter for this geometry. TODO explain
- inputAdapter_t *ia1 = new inputAdapter_t(localCount,globalIds,x,y,z,1,1,1);
- // Create a Zoltan2 partitioning problem
- Zoltan2::PartitioningProblem<inputAdapter_t> *problem1 =
- new Zoltan2::PartitioningProblem<inputAdapter_t>(ia1, ¶ms);
- // Solve the problem
- MPI_Barrier(MPI_COMM_WORLD);
- double startTime = MPI_Wtime();
- problem1->solve();
- MPI_Barrier(MPI_COMM_WORLD);
- double totalTime = startTime - MPI_Wtime();
- std::cout << "Total time is " << totalTime << endl;
- // create metric object where communicator is Teuchos default
- quality_t *metricObject1 = new quality_t(ia1, ¶ms, //problem1->getComm(),
- &problem1->getSolution());
- // Check the solution.
- if (rank == 0) {
- metricObject1->printMetrics(cout);
- }
- if (rank == 0){
- scalar_t imb = metricObject1->getObjectCountImbalance();
- if (imb <= tolerance)
- std::cout << "pass: " << imb << std::endl;
- else
- std::cout << "fail: " << imb << std::endl;
- std::cout << std::endl;
- }
- delete metricObject1;
- if (coords)
- delete [] coords;
- if (globalIds)
- delete [] globalIds;
- delete problem1;
- delete ia1;
- MPI_Finalize();
- if (rank == 0)
- std::cout << "PASS" << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement