![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * point_locater.hpp
00003 * Ryan H. Lewis
00004 * Copyright 2012
00005 */
00006 #include
00007 #include
00008 #include
00009
00010 #include
00011 #include
00012
00013 #ifndef POINT_LOCATER_HPP
00014 #define POINT_LOCATER_HPP
00015
00016 namespace moab
00017 {
00018
00019 template < typename _Tree, typename _Boxes >
00020 class Point_search
00021 {
00022
00023 // public types
00024 public:
00025 typedef _Tree Tree;
00026 typedef _Boxes Boxes;
00027 // typedef typename Tree::Elements::value_type Element;
00028 typedef int Error;
00029
00030 // private types
00031 private:
00032 typedef Point_search< _Tree, _Boxes > Self;
00033 // public methods
00034 public:
00035 // Constructor
00036 Point_search( Tree& _tree, Boxes& _boxes ) : tree_( _tree ), boxes( _boxes ) {}
00037
00038 // Copy constructor
00039 Point_search( Self& s ) : tree_( s.tree_ ), boxes( s.boxes ) {}
00040
00041 // private functionality
00042 private:
00043 // TODO: deprecate this
00044 template < typename Point_map, typename List >
00045 void resolve_boxes( const Point_map& query_points, List& list )
00046 {
00047 /*
00048 typedef typename std::vector< bool> Bitmask;
00049 typedef typename Points::const_iterator Point;
00050 typedef typename Tree::const_element_iterator Element;
00051 typedef typename std::vector< std::size_t> Processor_list;
00052 typedef typename List::value_type Tuple;
00053 const Element & end = tree_.element_end();
00054 Bitmask located_points( query_points.size(), 0);
00055 std::size_t index=0;
00056 for( Point i = query_points.begin();
00057 i != query_points.end(); ++i,++index){
00058 const Element & element = tree_.find( *i);
00059 if(element != end){
00060 located_points[ index] = 1;
00061 }
00062 }
00063 for(int i = 0; i < located_points.size(); ++i){
00064 if(!located_points[ i]){
00065 Processor_list processors;
00066 const Point & point = query_point.begin()+i;
00067 resolve_box_for_point( point, processors);
00068 for( std::size_t p = processors.begin();
00069 p != processors.end(); ++p){
00070 list.push_back( Tuple( *point, *p) );
00071 }
00072 }
00073 }
00074 */
00075 }
00076
00077 // public functionality
00078 public:
00079 template < typename Point_map, typename Entities, typename Communicator >
00080 Error locate_points( Point_map& query_points, Entities& entities, Communicator& comm, double tol )
00081 {
00082 /*TODO: implement a parallel location algorithm here
00083 original algorithm:
00084 all-scatter/gather bounding boxes
00085 for each point perform box checks
00086 scatter/gather points
00087 perform location and solution interpolation
00088 //send results back
00089 ------------
00090 new algorithm
00091 Assume power num_proc = n^2;
00092 all-reduce bounding boxes
00093 divide box up into n x n grid
00094 each source processor can communicate its elements to grid proc
00095 each target processor then communicates its points to grid proc
00096 grid proc sends points to correct source proc.
00097 */
00098 return 0;
00099 }
00100
00101 template < typename Points, typename Entities >
00102 Error locate_points( const Points& query_points, Entities& entities, double tol ) const
00103 {
00104 typedef typename Points::const_iterator Point_iterator;
00105 typedef typename Entities::value_type Result;
00106 Entities result;
00107 result.reserve( query_points.size() );
00108 for( Point_iterator i = query_points.begin(); i != query_points.end(); ++i )
00109 {
00110 Result h;
00111 tree_.find( *i, tol, h );
00112 result.push_back( h );
00113 }
00114 entities = result;
00115 return 0;
00116 }
00117
00118 template < typename Points, typename Entities >
00119 Error bruteforce_locate_points( const Points& query_points, Entities& entities, double tol ) const
00120 {
00121 // TODO: this could be faster with caching, but of course this is
00122 // really just for testing
00123 typedef typename Points::const_iterator Point_iterator;
00124 typedef typename Entities::value_type::first_type Entity_handle;
00125 Entities result;
00126 result.reserve( query_points.size() );
00127 std::size_t count = 0;
00128 std::stringstream ss;
00129 typename Entities::iterator j = entities.begin();
00130 for( Point_iterator i = query_points.begin(); i != query_points.end(); ++i, ++j )
00131 {
00132 if( j->first == 0 )
00133 {
00134 const Entity_handle h = tree_.bruteforce_find( *i, tol );
00135 if( h == 0 )
00136 {
00137 ++count;
00138 for( int k = 0; k < 3; ++k )
00139 {
00140 ss << ( *i )[k];
00141 if( k < 2 )
00142 {
00143 ss << ", ";
00144 }
00145 else
00146 {
00147 ss << std::endl;
00148 }
00149 }
00150 }
00151 }
00152 }
00153 std::ofstream out( "unlocated_pts" );
00154 out << ss.str();
00155 out.close();
00156 std::cout << count << " vertices are not contained in _any_ elements!" << std::endl;
00157 return 0;
00158 }
00159
00160 // public accessor methods
00161 public:
00162 Tree& tree() const
00163 {
00164 return tree_;
00165 }
00166
00167 // private data members
00168 private:
00169 const Tree& tree_;
00170 const Boxes& boxes;
00171 }; // class Point_search
00172
00173 } // namespace moab
00174
00175 #endif // POINT_LOCATER_HPP