Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "ProcessSet.hpp" 00002 00003 #include <cassert> 00004 00005 namespace moab 00006 { 00007 00008 ProcessSet::ProcessSet() 00009 { 00010 this->clear(); 00011 } 00012 00013 ProcessSet::ProcessSet( const unsigned char* psetbits ) 00014 { 00015 for( int i = 0; i < SHARED_PROC_BYTES; ++i ) 00016 this->processes[i] = psetbits[i]; 00017 } 00018 00019 ProcessSet::~ProcessSet() {} 00020 00021 void ProcessSet::unite( const ProcessSet& other ) 00022 { 00023 for( int i = 0; i < SHARED_PROC_BYTES; ++i ) 00024 { 00025 this->processes[i] |= other.processes[i]; 00026 } 00027 } 00028 00029 void ProcessSet::intersect( const ProcessSet& other ) 00030 { 00031 for( int i = 0; i < SHARED_PROC_BYTES; ++i ) 00032 { 00033 this->processes[i] &= other.processes[i]; 00034 } 00035 } 00036 00037 void ProcessSet::clear() 00038 { 00039 memset( this->processes, 0, SHARED_PROC_BYTES ); 00040 } 00041 00042 /**\brief Add a process to this process set. 00043 * 00044 * This does not verify that \a proc is within the range [0,MAX_SHARING_PROCS[ . 00045 * You are responsible for that. 00046 */ 00047 void ProcessSet::set_process_member( int proc ) 00048 { 00049 int byte = proc / 8; 00050 int bitmask = 1 << ( proc % 8 ); 00051 this->processes[byte] |= bitmask; 00052 } 00053 00054 /**\brief Add each process in the input vector to this process set. 00055 * 00056 * This is a convenience routine that calls set_process_member() for each entry in the vector. 00057 * This does not verify that \a proc is within the range [0,MAX_SHARING_PROCS[ . 00058 * You are responsible for that. 00059 */ 00060 void ProcessSet::set_process_members( const std::vector< int >& procs ) 00061 { 00062 for( std::vector< int >::const_iterator it = procs.begin(); it != procs.end() && *it != -1; ++it ) 00063 { 00064 this->set_process_member( *it ); 00065 } 00066 } 00067 00068 /**\brief Retrieve a vector containing processes in this set. 00069 * 00070 * @param [in] rank The rank of the local process. This integer will not be included in the output 00071 * list. 00072 * @param [out] procs The vector in which the list of sharing processes is listed. 00073 * @return True when \a rank is the owning process and false otherwise. 00074 */ 00075 bool ProcessSet::get_process_members( int rank, std::vector< int >& procs ) 00076 { 00077 int i = 0; 00078 assert( rank >= 0 ); 00079 procs.clear(); 00080 bool rank_owner = false; 00081 for( int byte = 0; byte < SHARED_PROC_BYTES; ++byte ) 00082 { 00083 i = byte * 8; 00084 for( unsigned char val = this->processes[byte]; val; ++i, val >>= 1 ) 00085 { 00086 if( val & 0x1 ) 00087 { 00088 if( i != rank ) 00089 { 00090 // std::cout << " " << i; 00091 procs.push_back( i ); 00092 } 00093 else if( !procs.size() ) 00094 { 00095 rank_owner = true; 00096 } 00097 } 00098 } 00099 } 00100 for( i = procs.size(); i < MAX_SHARING_PROCS; ++i ) 00101 { 00102 procs.push_back( -1 ); // pad with invalid values 00103 } 00104 return rank_owner; 00105 } 00106 00107 bool ProcessSet::is_process_member( int i ) const 00108 { 00109 int byte = i / 8; 00110 int bitmask = 1 << ( i % 8 ); 00111 return ( this->processes[byte] & bitmask ) ? true : false; 00112 } 00113 00114 const unsigned char* ProcessSet::data() const 00115 { 00116 return this->processes; 00117 } 00118 00119 bool ProcessSet::operator<( const ProcessSet& other ) const 00120 { 00121 for( int i = 0; i < SHARED_PROC_BYTES; ++i ) 00122 { 00123 if( this->processes[i] < other.processes[i] ) 00124 return true; 00125 else if( this->processes[i] > other.processes[i] ) 00126 return false; 00127 } 00128 return false; // equality 00129 } 00130 00131 std::ostream& operator<<( std::ostream& os, const ProcessSet& pset ) 00132 { 00133 for( int i = 0; i < MAX_SHARING_PROCS; ++i ) 00134 { 00135 os << ( pset.is_process_member( i ) ? "1" : "0" ); 00136 } 00137 return os; 00138 } 00139 00140 } // namespace moab