moab
|
Represent a set of processes using a bit vector. More...
#include <ProcessSet.hpp>
Public Types | |
enum | { SHARED_PROC_BYTES = (MAX_SHARING_PROCS / 8 + (MAX_SHARING_PROCS % 8 ? 1 : 0)) } |
Public Member Functions | |
ProcessSet () | |
ProcessSet (const unsigned char *psetbits) | |
~ProcessSet () | |
void | unite (const ProcessSet &other) |
void | intersect (const ProcessSet &other) |
void | clear () |
void | set_process_member (int i) |
Add a process to this process set. | |
void | set_process_members (const std::vector< int > &procs) |
Add each process in the input vector to this process set. | |
bool | get_process_members (int rank, std::vector< int > &procs) |
Retrieve a vector containing processes in this set. | |
bool | is_process_member (int i) const |
const unsigned char * | data () const |
bool | operator< (const ProcessSet &other) const |
Protected Attributes | |
unsigned char | processes [SHARED_PROC_BYTES] |
Friends | |
std::ostream & | operator<< (std::ostream &os, const ProcessSet &pset) |
Represent a set of processes using a bit vector.
This is used by the mesh refiner when determining where to record split vertices so that labeling can be inferred across process boundaries without communicating anything other than the number of entities in a given partition.
Definition at line 34 of file ProcessSet.hpp.
anonymous enum |
Definition at line 37 of file ProcessSet.hpp.
{ SHARED_PROC_BYTES = (MAX_SHARING_PROCS / 8 + (MAX_SHARING_PROCS % 8 ? 1 : 0)) };
Definition at line 7 of file ProcessSet.cpp.
{ this->clear(); }
moab::ProcessSet::ProcessSet | ( | const unsigned char * | psetbits | ) |
Definition at line 12 of file ProcessSet.cpp.
{ for ( int i = 0; i < SHARED_PROC_BYTES; ++ i ) this->processes[i] = psetbits[i]; }
Definition at line 18 of file ProcessSet.cpp.
{ }
void moab::ProcessSet::clear | ( | ) |
Definition at line 38 of file ProcessSet.cpp.
{ memset( this->processes, 0, SHARED_PROC_BYTES ); }
const unsigned char * moab::ProcessSet::data | ( | ) | const |
Definition at line 114 of file ProcessSet.cpp.
{ return this->processes; }
bool moab::ProcessSet::get_process_members | ( | int | rank, |
std::vector< int > & | procs | ||
) |
Retrieve a vector containing processes in this set.
[in] | rank | The rank of the local process. This integer will not be included in the output list. |
[out] | procs | The vector in which the list of sharing processes is listed. |
Definition at line 75 of file ProcessSet.cpp.
{ int i = 0; assert( rank >= 0 ); procs.clear(); bool rank_owner = false; for ( int byte = 0; byte < SHARED_PROC_BYTES; ++ byte ) { i = byte * 8; for ( unsigned char val = this->processes[byte]; val; ++ i, val >>= 1 ) { if ( val & 0x1 ) { if ( i != rank ) { //std::cout << " " << i; procs.push_back( i ); } else if ( ! procs.size() ) { rank_owner = true; } } } } for ( i = procs.size(); i < MAX_SHARING_PROCS; ++ i ) { procs.push_back( -1 ); // pad with invalid values } return rank_owner; }
void moab::ProcessSet::intersect | ( | const ProcessSet & | other | ) |
Definition at line 30 of file ProcessSet.cpp.
{ for ( int i = 0; i < SHARED_PROC_BYTES; ++ i ) { this->processes[i] &= other.processes[i]; } }
bool moab::ProcessSet::is_process_member | ( | int | i | ) | const |
Definition at line 107 of file ProcessSet.cpp.
{ int byte = i / 8; int bitmask = 1 << ( i % 8 ); return ( this->processes[byte] & bitmask ) ? true : false; }
bool moab::ProcessSet::operator< | ( | const ProcessSet & | other | ) | const |
Definition at line 119 of file ProcessSet.cpp.
{ for ( int i = 0; i < SHARED_PROC_BYTES; ++ i ) { if ( this->processes[i] < other.processes[i] ) return true; else if ( this->processes[i] > other.processes[i] ) return false; } return false; // equality }
void moab::ProcessSet::set_process_member | ( | int | proc | ) |
Add a process to this process set.
This does not verify that proc is within the range [0,MAX_SHARING_PROCS[ . You are responsible for that.
Definition at line 48 of file ProcessSet.cpp.
{ int byte = proc / 8; int bitmask = 1 << ( proc % 8 ); this->processes[byte] |= bitmask; }
void moab::ProcessSet::set_process_members | ( | const std::vector< int > & | procs | ) |
Add each process in the input vector to this process set.
This is a convenience routine that calls set_process_member() for each entry in the vector. This does not verify that proc is within the range [0,MAX_SHARING_PROCS[ . You are responsible for that.
Definition at line 61 of file ProcessSet.cpp.
{ for ( std::vector<int>::const_iterator it = procs.begin(); it != procs.end() && *it != -1; ++ it ) { this->set_process_member( *it ); } }
void moab::ProcessSet::unite | ( | const ProcessSet & | other | ) |
Definition at line 22 of file ProcessSet.cpp.
{ for ( int i = 0; i < SHARED_PROC_BYTES; ++ i ) { this->processes[i] |= other.processes[i]; } }
std::ostream& operator<< | ( | std::ostream & | os, |
const ProcessSet & | pset | ||
) | [friend] |
Definition at line 131 of file ProcessSet.cpp.
{ for ( int i = 0; i < MAX_SHARING_PROCS; ++ i ) { os << ( pset.is_process_member( i ) ? "1" : "0" ); } return os; }
unsigned char moab::ProcessSet::processes[SHARED_PROC_BYTES] [protected] |
Definition at line 64 of file ProcessSet.hpp.