Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "moab/ParallelData.hpp" 00002 #include "moab/ParallelComm.hpp" 00003 #include "MBParallelConventions.h" 00004 #include "moab/Interface.hpp" 00005 00006 #include <map> 00007 00008 namespace moab 00009 { 00010 00011 //! return partition sets; if tag_name is input, gets sets with 00012 //! that tag name, otherwise uses PARALLEL_PARTITION tag 00013 ErrorCode ParallelData::get_partition_sets( Range& part_sets, const char* tag_name ) 00014 { 00015 Tag part_tag = 0; 00016 ErrorCode result; 00017 00018 if( NULL != tag_name ) 00019 result = mbImpl->tag_get_handle( tag_name, 1, MB_TYPE_INTEGER, part_tag ); 00020 else 00021 result = mbImpl->tag_get_handle( PARALLEL_PARTITION_TAG_NAME, 1, MB_TYPE_INTEGER, part_tag ); 00022 00023 if( MB_SUCCESS != result ) 00024 return result; 00025 else if( 0 == part_tag ) 00026 return MB_TAG_NOT_FOUND; 00027 00028 result = mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &part_tag, NULL, 1, part_sets, Interface::UNION ); 00029 return result; 00030 } 00031 00032 //! get communication interface sets and the processors with which 00033 //! this processor communicates; sets are sorted by processor 00034 ErrorCode ParallelData::get_interface_sets( std::vector< EntityHandle >& iface_sets, std::vector< int >& iface_procs ) 00035 { 00036 #define CONTINUE \ 00037 { \ 00038 result = tmp_result; \ 00039 continue; \ 00040 } 00041 iface_sets.clear(); 00042 iface_procs.clear(); 00043 00044 Tag proc_tag = 0, procs_tag = 0; 00045 ErrorCode result = MB_SUCCESS; 00046 int my_rank; 00047 if( parallelComm ) 00048 my_rank = parallelComm->proc_config().proc_rank(); 00049 else 00050 return MB_FAILURE; 00051 00052 std::multimap< int, EntityHandle > iface_data; 00053 00054 for( int i = 0; i < 2; i++ ) 00055 { 00056 ErrorCode tmp_result; 00057 00058 if( 0 == i ) 00059 tmp_result = mbImpl->tag_get_handle( PARALLEL_SHARED_PROC_TAG_NAME, 1, MB_TYPE_INTEGER, proc_tag ); 00060 else 00061 tmp_result = 00062 mbImpl->tag_get_handle( PARALLEL_SHARED_PROCS_TAG_NAME, MAX_SHARING_PROCS, MB_TYPE_INTEGER, proc_tag ); 00063 if( MB_SUCCESS != tmp_result ) CONTINUE; 00064 00065 int tsize; 00066 tmp_result = mbImpl->tag_get_length( proc_tag, tsize ); 00067 if( 0 == tsize || MB_SUCCESS != tmp_result ) CONTINUE; 00068 00069 Range proc_sets; 00070 tmp_result = 00071 mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &proc_tag, NULL, 1, proc_sets, Interface::UNION ); 00072 if( MB_SUCCESS != tmp_result ) CONTINUE; 00073 00074 if( proc_sets.empty() ) CONTINUE; 00075 00076 std::vector< int > proc_tags( proc_sets.size() * tsize ); 00077 tmp_result = mbImpl->tag_get_data( procs_tag, proc_sets, &proc_tags[0] ); 00078 if( MB_SUCCESS != tmp_result ) CONTINUE; 00079 int k; 00080 Range::iterator rit; 00081 00082 for( k = 0, rit = proc_sets.begin(); rit != proc_sets.end(); ++rit, k++ ) 00083 { 00084 for( int j = 0; j < tsize; j++ ) 00085 { 00086 if( my_rank != proc_tags[2 * k + j] && proc_tags[2 * k + j] >= 0 ) 00087 iface_data.insert( std::pair< int, EntityHandle >( proc_tags[2 * k + j], *rit ) ); 00088 } 00089 } 00090 } 00091 00092 // now get the results in sorted order 00093 std::multimap< int, EntityHandle >::iterator mit; 00094 for( mit = iface_data.begin(); mit != iface_data.end(); ++mit ) 00095 iface_procs.push_back( ( *mit ).first ), iface_sets.push_back( ( *mit ).second ); 00096 00097 return result; 00098 } 00099 00100 } // namespace moab