moab
ReduceExchangeTags.cpp File Reference
#include "moab/ParallelComm.hpp"
#include "MBParallelConventions.h"
#include "moab/Core.hpp"
#include <iostream>
#include <string>
#include <sstream>

Go to the source code of this file.

Defines

#define CHKERR(CODE, MSG)
#define MPICHKERR(CODE, MSG)
#define dbgprint(MSG)
#define dbgprintall(MSG)

Functions

ErrorCode get_file_options (int argc, char **argv, std::string &filename, std::string &tagName, double &tagValues)
int main (int argc, char **argv)

Define Documentation

#define CHKERR (   CODE,
  MSG 
)
Value:
do {                                                    \
    if (MB_SUCCESS != (CODE)) {                           \
      std::string errstr;  mbi->get_last_error(errstr);   \
      std::cerr << errstr << std::endl;                   \
      std::cerr << MSG << std::endl;                      \
      MPI_Finalize();                                     \
    }                                                     \
  } while(false)

Definition at line 38 of file ReduceExchangeTags.cpp.

#define dbgprint (   MSG)
Value:
do {                                              \
      if (!rank) std::cerr << MSG << std::endl;     \
  } while(false)
Examples:
ReduceExchangeTags.cpp.

Definition at line 57 of file ReduceExchangeTags.cpp.

#define dbgprintall (   MSG)
Value:
do {                                                        \
      std::cerr << "[" << rank << "]: " << MSG << std::endl;  \
  } while(false)
Examples:
ReduceExchangeTags.cpp.

Definition at line 62 of file ReduceExchangeTags.cpp.

#define MPICHKERR (   CODE,
  MSG 
)
Value:
do {                                                    \
    if (0 != CODE) {                                      \
      std::cerr << MSG << std::endl;                      \
      MPI_Finalize();                                     \
    }                                                     \
  } while(false)
Examples:
ReduceExchangeTags.cpp.

Definition at line 49 of file ReduceExchangeTags.cpp.


Function Documentation

ErrorCode get_file_options ( int  argc,
char **  argv,
std::string &  filename,
std::string &  tagName,
double &  tagValues 
)

Definition at line 69 of file ReduceExchangeTags.cpp.

{
  // get mesh filename
  if (argc > 1) filename = std::string(argv[1]);
  else filename = std::string(MESH_DIR) + std::string("/64bricks_1khex.h5m");

  // get tag selection options
  if (argc > 2) tagName = std::string(argv[2]);
  else tagName = "USERTAG";

  if (argc > 3)  tagValues = atof(argv[3]);
  else tagValues = 1.0;

  return MB_SUCCESS;
}
int main ( int  argc,
char **  argv 
)

Parallel Read options: PARALLEL = type {READ_PART} PARTITION = PARALLEL_PARTITION : Partition as you read PARALLEL_RESOLVE_SHARED_ENTS : Communicate to all processors to get the shared adjacencies consistently in parallel PARALLEL_GHOSTS : a.b.c : a = 3 - highest dimension of entities : b = 0 - : c = 1 - number of layers PARALLEL_COMM = index

Definition at line 91 of file ReduceExchangeTags.cpp.

{
  ErrorCode err;
  int ierr, rank;
  std::string filename, tagName;
  double tagValue;
  MPI_Comm comm = MPI_COMM_WORLD;
  std::string read_options = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION_DISTRIBUTE;PARALLEL_GHOSTS=3.0.1;PARALLEL_COMM=0";

  // Print usage if not enough arguments
  if (argc < 1) {
    std::cerr << "Usage: ";
    std::cerr << argv[0] << " <file_name> <tag_name> <tag_value>" << std::endl;
    std::cerr << "file_name    : mesh file name" << std::endl;
    std::cerr << "tag_name     : name of tag to add to mesh" << std::endl;
    std::cerr << "tag_value    : a double valued string to set for highest-dimensional entities in the mesh for the named tag" << std::endl;

    ierr = MPI_Finalize();
    MPICHKERR(ierr, "MPI_Finalize failed; Aborting");

    return 1;
  }

  // Initialize MPI first
  ierr = MPI_Init(&argc, &argv);
  MPICHKERR(ierr, "MPI_Init failed");

  ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPICHKERR(ierr, "MPI_Comm_rank failed");

  dbgprint( "********** reduce_exchange_tags **********\n" );

  // Create the moab instance
  Interface *mbi = new Core();
  CHKERR(NULL == mbi, "MOAB constructor failed");

  // Get the input options
  err = get_file_options(argc, argv, filename, tagName, tagValue);
  CHKERR(err, "get_file_options failed");

  // Print out the input parameters
  dbgprint( " Input Parameters - " );
  dbgprint( "   Filenames: " << filename );
  dbgprint( "   Tag: Name=" << tagName << " Value=" << tagValue << std::endl );

  // Create root sets for each mesh.  Then pass these
  // to the load_file functions to be populated.
  EntityHandle rootset, partnset;
  err = mbi->create_meshset(MESHSET_SET, rootset);
  CHKERR(err, "Creating root set failed");
  err = mbi->create_meshset(MESHSET_SET, partnset);
  CHKERR(err, "Creating partition set failed");

  // Create the parallel communicator object with the partition handle associated with MOAB
  ParallelComm *parallel_communicator = ParallelComm::get_pcomm( mbi, partnset, &comm );

  // Load the file from disk with given options
  err = mbi->load_file( filename.c_str(), &rootset, read_options.c_str() );
  CHKERR(err, "MOAB::load_file failed");

  // Create two tag handles: Exchange and Reduction operations
  dbgprint( "-Creating tag handle " << tagName << "..." );
  Tag tagReduce, tagExchange;
  {
    std::stringstream sstr;
    // Create the exchange tag: default name = USERTAG_EXC
    sstr << tagName << "_EXC";
    err = mbi->tag_get_handle(sstr.str().c_str(), 1, MB_TYPE_INTEGER, tagExchange, MB_TAG_CREAT|MB_TAG_DENSE, &tagValue);
    CHKERR(err, "Retrieving tag handles failed");

    // Create the exchange tag: default name = USERTAG_RED
    sstr.str(""); sstr << tagName << "_RED";
    err = mbi->tag_get_handle(sstr.str().c_str(), 1, MB_TYPE_DOUBLE, tagReduce, MB_TAG_CREAT|MB_TAG_DENSE, &tagValue);
    CHKERR(err, "Retrieving tag handles failed");
  }

  // Perform exchange tag data
  dbgprint( "-Exchanging tags between processors " );
  {
    Range partEnts, dimEnts;
    for (int dim = 0; dim <= 3; dim++) {
      // Get all entities of dimension = dim
      err = mbi->get_entities_by_dimension(rootset, dim, dimEnts, false);

      std::vector<int> tagValues(dimEnts.size(), static_cast<int>(tagValue)*(rank+1)*(dim+1));
      // Set local tag data for exchange
      err = mbi->tag_set_data(tagExchange, dimEnts, &tagValues[0]);
      CHKERR(err, "Setting local tag data failed during exchange phase");
      // Merge entities into parent set
      partEnts.merge(dimEnts);
    }

    // Exchange tags between processors
    err = parallel_communicator->exchange_tags(tagExchange, partEnts);
    CHKERR(err, "Exchanging tags between processors failed");
  }

  // Perform reduction of tag data
  dbgprint( "-Reducing tags between processors " );
  {
    Range partEnts;
    // Get all higher dimensional entities belonging to current partition
    err = parallel_communicator->get_part_entities(partEnts);
    CHKERR(err, "ParallelComm::get_part_entities failed");

    // Output what is in current partition sets
    dbgprintall( "Number of Partitioned entities: " <<  partEnts.size() );
    MPI_Barrier(comm);

    // Set local tag data for reduction
    std::vector<double> tagValues(partEnts.size(), tagValue*(rank+1));
    err = mbi->tag_set_data(tagReduce, partEnts, &tagValues[0]);
    CHKERR(err, "Setting local tag data failed during reduce phase");

    Range dummy;
    // Reduce tag data using MPI_SUM on the interface between partitions
    err = parallel_communicator->reduce_tags(tagReduce, MPI_SUM, dummy/*partEnts*/);
    CHKERR(err, "Reducing tags between processors failed");
  }
  // Write out to output file to visualize reduction/exchange of tag data
  mbi->write_file("test.h5m", "H5M", "PARALLEL=WRITE_PART");

  // Done, cleanup
  delete mbi;

  dbgprint( "\n********** reduce_exchange_tags DONE! **********" );
  MPI_Finalize();
  return 0;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines