|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/Core.hpp"#include "moab/ParallelComm.hpp"#include "moab/ScdInterface.hpp"#include "moab/HomXform.hpp"#include "moab/ProgOptions.hpp"#include "MBTagConventions.hpp"#include "TestUtil.hpp"#include <string>#include <iomanip>#include <iostream>#include <cassert>
Include dependency graph for structured3.cpp:Go to the source code of this file.
Functions | |
| void | create_parallel_mesh () |
| int | main (int argc, char *argv[]) |
Variables | |
| int | NC |
| const int | ITERS = 50 |
| void create_parallel_mesh | ( | ) |
Definition at line 42 of file structured3.cpp.
References moab::ScdBox::box_set(), CHECK_ERR, moab::ScdInterface::construct_box(), ErrorCode, moab::ParallelComm::exchange_ghost_cells(), moab::ParallelComm::exchange_tags(), moab::ScdParData::gDims, moab::Core::get_last_error(), moab::Core::globalId_tag(), ITERS, MB_SUCCESS, MB_TAG_DENSE, MB_TAG_EXCL, MB_TYPE_DOUBLE, mbint, MPI_COMM_WORLD, NC, moab::ScdParData::partMethod, moab::ScdParData::pComm, moab::Interface::query_interface(), moab::ParallelComm::rank(), moab::ParallelComm::resolve_shared_ents(), moab::ParallelComm::size(), moab::ScdParData::SQIJK, and moab::Core::tag_get_handle().
Referenced by main().
{
Core mbint;
ParallelComm pc( &mbint, MPI_COMM_WORLD );
ScdInterface* scdi;
ErrorCode rval = mbint.query_interface( scdi );CHECK_ERR( rval );
// pc.set_debug_verbosity(2);
// create a structured mesh in parallel
ScdBox* new_box;
ScdParData par_data;
par_data.pComm = &pc;
par_data.gDims[0] = par_data.gDims[1] = par_data.gDims[2] = 0;
par_data.gDims[3] = par_data.gDims[4] = par_data.gDims[5] = NC;
if( ( par_data.gDims[3] - par_data.gDims[0] ) * ( par_data.gDims[3] - par_data.gDims[0] ) *
( par_data.gDims[3] - par_data.gDims[0] ) <
(int)pc.size() )
{
std::cerr << "Too few processors for this number of elements." << std::endl;CHECK_ERR( MB_FAILURE );
}
par_data.partMethod = ScdParData::SQIJK;
// timing data
double times[5]; // tstart, tvert, tnonvert, tghost, titer;
times[0] = MPI_Wtime();
rval = scdi->construct_box( HomCoord(), HomCoord(), NULL, 0, // no vertex positions
new_box, NULL, // not locally periodic
&par_data, true,
false ); // assign global ids, don't resolve shared verts
CHECK_ERR( rval );
// get global id tag
Tag tag = mbint.globalId_tag();
// resolve shared verts
std::cout << "Resolving shared ents..." << std::endl;
rval = pc.resolve_shared_ents( new_box->box_set(), -1, 0, &tag );CHECK_ERR( rval );
times[1] = MPI_Wtime();
std::cout << "Exchanging ghost cells..." << std::endl;
rval = pc.exchange_ghost_cells( -1, -1, 0, 0, true, true );CHECK_ERR( rval );
times[2] = MPI_Wtime();
// pc.list_entities(0,-1);
rval = pc.exchange_ghost_cells( -1, 0, 1, 0, true );
if( MB_SUCCESS != rval )
{
std::string err;
mbint.get_last_error( err );
std::cerr << "Error: proc " << pc.rank() << ": " << err << std::endl;
}
CHECK_ERR( rval );
times[3] = MPI_Wtime();
// pc.list_entities(0,-1);
// Create a tag, used in exchange_tags
int def_val = 1.0;
rval = mbint.tag_get_handle( "test_tag", 1, MB_TYPE_DOUBLE, tag, MB_TAG_DENSE | MB_TAG_EXCL, &def_val );CHECK_ERR( rval );
Range empty_range;
if( !pc.rank() ) std::cout << "Exchanging tags: ";
for( int i = 0; i < ITERS; i++ )
{
if( !pc.rank() ) std::cout << i << ";";
pc.exchange_tags( tag, empty_range );CHECK_ERR( rval );
}
if( !pc.rank() ) std::cout << std::endl;
times[4] = MPI_Wtime();
for( int i = 4; i >= 1; i-- )
times[i] -= times[i - 1];
double tottimes[5] = { 0.0 };
MPI_Reduce( times + 1, tottimes + 1, 4, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD );
if( !pc.rank() )
std::cout << "Times: " << std::endl
<< "Create: " << times[1] << std::endl
<< "Resolve verts: " << times[2] << std::endl
<< "Resolve non-verts: " << times[3] << std::endl
<< "Exchange ghosts: " << times[4] << std::endl;
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 27 of file structured3.cpp.
References ProgOptions::addOpt(), create_parallel_mesh(), ProgOptions::getOpt(), NC, ProgOptions::parseCommandLine(), and RUN_TEST.
{
MPI_Init( &argc, &argv );
ProgOptions po;
po.addOpt< int >( "int,i", "Number of intervals on a side" );
po.parseCommandLine( argc, argv );
if( !po.getOpt( "int", &NC ) ) NC = 4;
int err = RUN_TEST( create_parallel_mesh );
MPI_Finalize();
return err;
}
| const int ITERS = 50 |
Definition at line 23 of file structured3.cpp.
Referenced by create_parallel_mesh().
| int NC |
Definition at line 16 of file structured3.cpp.
Referenced by create_parallel_mesh(), and main().