The RunttimeContext is an example specific class to store the run specific input data, MOAB datastructures used during the run and provides other utility functions to profile operations etc. More...
Public Member Functions | |
RuntimeContext (MPI_Comm comm=MPI_COMM_WORLD) | |
Constructor: allocate MOAB interface and communicator, and initialize other data members with some default values. More... | |
~RuntimeContext () | |
Destructor: deallocate MOAB interface and communicator. More... | |
void | ParseCLOptions (int argc, char *argv[]) |
Parse the runtime command line options. More... | |
void | timer_push (const std::string &operation) |
Measure and start the timer to profile a task. More... | |
void | timer_pop (const int nruns=1) |
Stop the timer and store the elapsed duration. More... | |
double | last_elapsed () const |
Return the last elapsed time. More... | |
moab::ErrorCode | load_file (bool load_ghosts=false) |
Load a MOAB supported file (h5m or nc format) from disk representing an MPAS mesh. More... | |
moab::ErrorCode | create_sv_tags (moab::Tag &tagScalar, moab::Tag &tagVector, moab::Range &entities) |
Create scalar and vector tags in the MOAB mesh instance. More... | |
double | evaluate_function (double lon, double lat, int type=1, double multiplier=1.0) const |
Evaluate some closed-form Spherical Harmonic functions with an optional multiplier term. More... | |
Public Attributes | |
int | dimension { 2 } |
std::string | input_filename |
dimension of the problem More... | |
std::string | output_filename |
input file name (nc format) More... | |
int | ghost_layers { 3 } |
output file name (h5m format) More... | |
std::string | scalar_tagname |
number of ghost layers More... | |
std::string | vector_tagname |
scalar tag name More... | |
int | vector_length { 3 } |
vector tag name More... | |
int | num_max_exchange { 10 } |
length of the vector tag components More... | |
bool | debug_output { false } |
total number of exchange iterations More... | |
int | proc_id { 1 } |
write debug output information? More... | |
int | num_procs { 1 } |
process identifier More... | |
double | last_counter { 0.0 } |
total number of processes More... | |
moab::Core | moab_interface |
last time counter between push/pop timer More... | |
moab::ParallelComm * | parallel_communicator |
moab::EntityHandle | fileset { 0 } |
moab::EntityHandle | partnset { 0 } |
Private Member Functions | |
std::vector< double > | compute_centroids (const moab::Range &entities) const |
Compute the centroids of elements in 2D lat/lon space. More... | |
Private Attributes | |
moab::CpuTimer | mTimer |
double | mTimerOps { 0.0 } |
std::string | mOpName |
The RunttimeContext is an example specific class to store the run specific input data, MOAB datastructures used during the run and provides other utility functions to profile operations etc.
Definition at line 77 of file ExchangeHalos.cpp.
|
explicit |
Constructor: allocate MOAB interface and communicator, and initialize other data members with some default values.
Implementation details ///.
Definition at line 331 of file ExchangeHalos.cpp.
332 : input_filename( std::string( MESH_DIR ) + std::string( "/io/mpasx1.642.t.2.nc" ) ),
333 output_filename( "exchangeHalos_output.h5m" ), scalar_tagname( "scalar_variable" ),
334 vector_tagname( "vector_variable" )
335 {
336 // Create sets for the mesh and partition. Then pass these to the load_file functions to populate the mesh.
337 runchk_cont( moab_interface.create_meshset( moab::MESHSET_SET, fileset ), "Creating root set failed" );
338 runchk_cont( moab_interface.create_meshset( moab::MESHSET_SET, partnset ), "Creating partition set failed" );
339
340 // Create the parallel communicator object with the partition handle associated with MOAB
341 parallel_communicator = moab::ParallelComm::get_pcomm( &moab_interface, partnset, &comm );
342
343 proc_id = parallel_communicator->rank();
344 num_procs = parallel_communicator->size();
345 }
References moab::Core::create_meshset(), fileset, moab::ParallelComm::get_pcomm(), MESHSET_SET, moab_interface, num_procs, parallel_communicator, partnset, proc_id, moab::ParallelComm::rank(), runchk_cont, and moab::ParallelComm::size().
RuntimeContext::~RuntimeContext | ( | ) |
Destructor: deallocate MOAB interface and communicator.
Definition at line 347 of file ExchangeHalos.cpp.
348 {
349 delete parallel_communicator;
350 }
References parallel_communicator.
|
private |
Compute the centroids of elements in 2D lat/lon space.
entities | Entities to compute centroids |
Definition at line 506 of file ExchangeHalos.cpp.
507 {
508 double node[3];
509 std::vector< double > eCentroids( entities.size() * 2 ); // [lon, lat]
510 size_t offset = 0;
511 for( auto entity : entities )
512 {
513 // Get the element coordinates (centroid) on the real mesh
514 runchk_cont( moab_interface.get_coords( &entity, 1, node ), "Getting entity coordinates failed" );
515
516 // scale by magnitude so that element is on unit sphere
517 double magnitude = std::sqrt( node[0] * node[0] + node[1] * node[1] + node[2] * node[2] );
518 node[0] /= magnitude;
519 node[1] /= magnitude;
520 node[2] /= magnitude;
521
522 // compute the spherical transformation onto unit sphere
523 eCentroids[offset] = atan2( node[1], node[0] );
524 if( eCentroids[offset] < 0.0 ) eCentroids[offset] += 2.0 * M_PI;
525 eCentroids[offset + 1] = asin( node[2] );
526
527 offset += 2; // increment the offset
528 }
529 // return centroid list for elements
530 return eCentroids;
531 }
References entities, moab::Core::get_coords(), moab_interface, and runchk_cont.
Referenced by create_sv_tags().
moab::ErrorCode RuntimeContext::create_sv_tags | ( | moab::Tag & | tagScalar, |
moab::Tag & | tagVector, | ||
moab::Range & | entities | ||
) |
Create scalar and vector tags in the MOAB mesh instance.
tagScalar | Tag reference to the scalar field |
tagVector | Tag reference to the vector field |
entities | Entities on which both the scalar and vector fields are defined |
Definition at line 408 of file ExchangeHalos.cpp.
409 {
410 // Get element (centroid) coordinates so that we can evaluate some arbitrary data
411 std::vector< double > entCoords = compute_centroids( entities ); // [entities * [lon, lat]]
412
413 if( proc_id == 0 ) std::cout << "> Getting scalar tag handle " << scalar_tagname << "..." << std::endl;
414 double defSTagValue = -1.0;
415 bool createdTScalar = false;
416 // Get or create the scalar tag: default name = "scalar_variable"
417 // Type: double, Components: 1, Layout: Dense (all entities potentially), Default: -1.0
418 runchk( moab_interface.tag_get_handle( scalar_tagname.c_str(), 1, moab::MB_TYPE_DOUBLE, tagScalar,
419 moab::MB_TAG_CREAT | moab::MB_TAG_DENSE, &defSTagValue, &createdTScalar ),
420 "Retrieving scalar tag handle failed" );
421
422 // we expect to create a new tag -- fail if Tag already exists since we do not want to overwrite data
423 assert( createdTScalar );
424 // set the data for scalar tag with an analytical Spherical Harmonic function
425 {
426 std::vector< double > tagValues( entities.size(), -1.0 );
427 std::generate( tagValues.begin(), tagValues.end(), [=, &entCoords]() {
428 static int index = 0;
429 const int offset = index++ * 2;
430 return evaluate_function( entCoords[offset], entCoords[offset + 1] );
431 } );
432 // Set local scalar tag data for exchange
433 runchk( moab_interface.tag_set_data( tagScalar, entities, tagValues.data() ),
434 "Setting scalar tag data failed" );
435 }
436
437 if( proc_id == 0 ) std::cout << "> Getting vector tag handle " << vector_tagname << "..." << std::endl;
438 std::vector< double > defVTagValue( vector_length, -1.0 );
439 bool createdTVector = false;
440 // Get or create the scalar tag: default name = "vector_variable"
441 // Type: double, Components: vector_length, Layout: Dense (all entities potentially), Default: [-1.0,..]
442 runchk( moab_interface.tag_get_handle( vector_tagname.c_str(), vector_length, moab::MB_TYPE_DOUBLE, tagVector,
443 moab::MB_TAG_CREAT | moab::MB_TAG_DENSE, defVTagValue.data(),
444 &createdTVector ),
445 "Retrieving vector tag handle failed" );
446
447 // we expect to create a new tag -- fail if Tag already exists since we do not want to overwrite data
448 assert( createdTVector );
449 // set the data for vector tag with an analytical Spherical Harmonic function
450 // with an optional scaling for each component; just to make it look different :-)
451 {
452 const int veclength = vector_length;
453 std::vector< double > tagValues( entities.size() * veclength, -1.0 );
454 std::generate( tagValues.begin(), tagValues.end(), [=, &entCoords]() {
455 static int index = 0;
456 const int offset = ( index++ / veclength ) * 2;
457 return this->evaluate_function( entCoords[offset], entCoords[offset + 1], 2, ( index % veclength + 1.0 ) );
458 } );
459 // Set local tag data for exchange
460 runchk( moab_interface.tag_set_data( tagVector, entities, tagValues.data() ),
461 "Setting vector tag data failed" );
462 }
463
464 return moab::MB_SUCCESS;
465 }
References compute_centroids(), entities, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, moab_interface, proc_id, runchk, scalar_tagname, moab::Core::tag_get_handle(), moab::Core::tag_set_data(), vector_length, and vector_tagname.
|
inline |
Evaluate some closed-form Spherical Harmonic functions with an optional multiplier term.
lon | Longitude in lat-lon space |
lat | Latitude in lat-lon space |
type | Function type |
multiplier | Optional multiplier to scale value (default=1.0) |
Definition at line 142 of file ExchangeHalos.cpp.
143 {
144 switch( type )
145 {
146 case 1:
147 return ( 2.0 + std::pow( sin( 2.0 * lat ), 16.0 ) * cos( 16.0 * lon ) ) * multiplier;
148 default:
149 return ( 2.0 + cos( lon ) * cos( lon ) * cos( 2.0 * lat ) ) * multiplier;
150 }
151 }
|
inline |
Return the last elapsed time.
Definition at line 403 of file ExchangeHalos.cpp.
404 {
405 return last_counter;
406 }
References last_counter.
moab::ErrorCode RuntimeContext::load_file | ( | bool | load_ghosts = false | ) |
Load a MOAB supported file (h5m or nc format) from disk representing an MPAS mesh.
load_ghosts | Optional boolean to specify whether to load ghosts when reading the file (only relevant for h5m) |
Parallel Read options: PARALLEL = type {READ_PART} : Read on all tasks PARTITION_METHOD = RCBZOLTAN : Use Zoltan partitioner to compute an online partition and redistribute on the fly PARTITION = PARALLEL_PARTITION : Partition as you read based on part information stored in h5m file PARALLEL_RESOLVE_SHARED_ENTS : Communicate to all processors to get the shared adjacencies consistently in parallel PARALLEL_GHOSTS : a.b.c : a = 2 - highest dimension of entities (2D in this case) : b = 1 - dimension of entities to calculate adjacencies (vertex=0, edges=1) : c = 3 - number of ghost layers needed (3 in this case)
Definition at line 467 of file ExchangeHalos.cpp.
468 {
469 /// Parallel Read options:
470 /// PARALLEL = type {READ_PART} : Read on all tasks
471 /// PARTITION_METHOD = RCBZOLTAN : Use Zoltan partitioner to compute an online partition and redistribute on the
472 /// fly PARTITION = PARALLEL_PARTITION : Partition as you read based on part information stored in h5m file
473 /// PARALLEL_RESOLVE_SHARED_ENTS : Communicate to all processors to get the shared adjacencies
474 /// consistently in parallel
475 /// PARALLEL_GHOSTS : a.b.c
476 /// : a = 2 - highest dimension of entities (2D in this case)
477 /// : b = 1 - dimension of entities to calculate adjacencies (vertex=0, edges=1)
478 /// : c = 3 - number of ghost layers needed (3 in this case)
479 std::string read_options = "DEBUG_IO=0;";
480 std::string::size_type idx = input_filename.rfind( '.' );
481 if( num_procs > 1 && idx != std::string::npos )
482 {
483 std::string extension = input_filename.substr( idx + 1 );
484 if( !extension.compare( "nc" ) )
485 // PARTITION_METHOD= [RCBZOLTAN, TRIVIAL]
486 read_options += "PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN;"
487 "PARALLEL_RESOLVE_SHARED_ENTS;NO_EDGES;NO_MIXED_ELEMENTS;VARIABLE=;";
488 else if( !extension.compare( "h5m" ) )
489 read_options +=
490 "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;"
491 "PARALLEL_RESOLVE_SHARED_ENTS;" +
492 ( load_ghosts ? "PARALLEL_THIN_GHOST_LAYER;PARALLEL_GHOSTS=2.1." + std::to_string( ghost_layers ) + ";"
493 : "" );
494 else
495 {
496 std::cout << "Error unsupported file type (only h5m and nc) for this example: " << input_filename
497 << std::endl;
498 return moab::MB_UNSUPPORTED_OPERATION;
499 }
500 }
501
502 // Load the file from disk with given read options in parallel and associate all entities to fileset
503 return moab_interface.load_file( input_filename.c_str(), &fileset, read_options.c_str() );
504 }
References fileset, ghost_layers, input_filename, moab::Core::load_file(), MB_UNSUPPORTED_OPERATION, moab_interface, and num_procs.
void RuntimeContext::ParseCLOptions | ( | int | argc, |
char * | argv[] | ||
) |
Parse the runtime command line options.
argc | - number of command line arguments |
argv | - command line arguments as string list |
Definition at line 352 of file ExchangeHalos.cpp.
353 {
354 ProgOptions opts;
355 // Input mesh
356 opts.addOpt< std::string >( "input", "Input mesh filename to load in parallel. Default=data/default_mesh_holes.h5m",
357 &input_filename );
358 // Output mesh
359 opts.addOpt< void >( "debug", "Should we write output file? Default=false", &debug_output );
360 opts.addOpt< std::string >( "output",
361 "Output mesh filename for verification (use --debug). Default=exchangeHalos_output.h5m",
362 &output_filename );
363 // Dimension of the input mesh
364 // Vector tag length
365 opts.addOpt< int >( "vtaglength", "Size of vector components per each entity. Default=3", &vector_length );
366 // Number of halo (ghost) regions
367 opts.addOpt< int >( "nghosts", "Number of ghost layers (halos) to exchange. Default=3", &ghost_layers );
368 // Number of times to perform the halo exchange for timing
369 opts.addOpt< int >( "nexchanges", "Number of ghost-halo exchange iterations to perform. Default=10",
370 &num_max_exchange );
371
372 opts.parseCommandLine( argc, argv );
373 }
References ProgOptions::addOpt(), debug_output, ghost_layers, input_filename, num_max_exchange, output_filename, ProgOptions::parseCommandLine(), and vector_length.
void RuntimeContext::timer_pop | ( | const int | nruns = 1 | ) |
Stop the timer and store the elapsed duration.
nruns | Optional argument used to average the measured time |
Definition at line 381 of file ExchangeHalos.cpp.
382 {
383 double locElapsed = mTimer.time_since_birth() - mTimerOps;
384 double avgElapsed = 0;
385 double maxElapsed = 0;
386 MPI_Reduce( &locElapsed, &maxElapsed, 1, MPI_DOUBLE, MPI_MAX, 0, parallel_communicator->comm() );
387 MPI_Reduce( &locElapsed, &avgElapsed, 1, MPI_DOUBLE, MPI_SUM, 0, parallel_communicator->comm() );
388 if( proc_id == 0 )
389 {
390 avgElapsed /= num_procs;
391 if( nruns > 1 )
392 std::cout << "[LOG] Time taken to " << mOpName.c_str() << ", averaged over " << nruns
393 << " runs : max = " << maxElapsed / nruns << ", avg = " << avgElapsed / nruns << "\n";
394 else
395 std::cout << "[LOG] Time taken to " << mOpName.c_str() << " : max = " << maxElapsed
396 << ", avg = " << avgElapsed << "\n";
397
398 last_counter = maxElapsed / nruns;
399 }
400 mOpName.clear();
401 }
References moab::ParallelComm::comm(), last_counter, mOpName, mTimer, mTimerOps, num_procs, parallel_communicator, proc_id, and moab::CpuTimer::time_since_birth().
|
inline |
Measure and start the timer to profile a task.
operation | String name of the task being measured |
Definition at line 375 of file ExchangeHalos.cpp.
376 { 377 mTimerOps = mTimer.time_since_birth(); 378 mOpName = operation; 379 }
References mOpName, mTimer, mTimerOps, and moab::CpuTimer::time_since_birth().
bool RuntimeContext::debug_output { false } |
total number of exchange iterations
Definition at line 88 of file ExchangeHalos.cpp.
Referenced by ParseCLOptions().
int RuntimeContext::dimension { 2 } |
Definition at line 80 of file ExchangeHalos.cpp.
moab::EntityHandle RuntimeContext::fileset { 0 } |
Definition at line 96 of file ExchangeHalos.cpp.
Referenced by load_file(), and RuntimeContext().
int RuntimeContext::ghost_layers { 3 } |
output file name (h5m format)
Definition at line 83 of file ExchangeHalos.cpp.
Referenced by load_file(), and ParseCLOptions().
std::string RuntimeContext::input_filename |
dimension of the problem
Definition at line 81 of file ExchangeHalos.cpp.
Referenced by load_file(), and ParseCLOptions().
double RuntimeContext::last_counter { 0.0 } |
total number of processes
Definition at line 91 of file ExchangeHalos.cpp.
Referenced by last_elapsed(), and timer_pop().
moab::Core RuntimeContext::moab_interface |
last time counter between push/pop timer
Definition at line 94 of file ExchangeHalos.cpp.
Referenced by compute_centroids(), create_sv_tags(), load_file(), and RuntimeContext().
|
private |
Definition at line 161 of file ExchangeHalos.cpp.
Referenced by timer_pop(), and timer_push().
|
private |
Definition at line 159 of file ExchangeHalos.cpp.
Referenced by timer_pop(), and timer_push().
|
private |
Definition at line 160 of file ExchangeHalos.cpp.
Referenced by timer_pop(), and timer_push().
int RuntimeContext::num_max_exchange { 10 } |
length of the vector tag components
Definition at line 87 of file ExchangeHalos.cpp.
Referenced by ParseCLOptions().
int RuntimeContext::num_procs { 1 } |
process identifier
Definition at line 90 of file ExchangeHalos.cpp.
Referenced by load_file(), RuntimeContext(), and timer_pop().
std::string RuntimeContext::output_filename |
input file name (nc format)
Definition at line 82 of file ExchangeHalos.cpp.
Referenced by ParseCLOptions().
moab::ParallelComm* RuntimeContext::parallel_communicator |
Definition at line 95 of file ExchangeHalos.cpp.
Referenced by RuntimeContext(), timer_pop(), and ~RuntimeContext().
moab::EntityHandle RuntimeContext::partnset { 0 } |
Definition at line 96 of file ExchangeHalos.cpp.
Referenced by RuntimeContext().
int RuntimeContext::proc_id { 1 } |
write debug output information?
Definition at line 89 of file ExchangeHalos.cpp.
Referenced by create_sv_tags(), RuntimeContext(), and timer_pop().
std::string RuntimeContext::scalar_tagname |
number of ghost layers
Definition at line 84 of file ExchangeHalos.cpp.
Referenced by create_sv_tags().
int RuntimeContext::vector_length { 3 } |
vector tag name
Definition at line 86 of file ExchangeHalos.cpp.
Referenced by create_sv_tags(), and ParseCLOptions().
std::string RuntimeContext::vector_tagname |