![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef INIT_TREE_HPP
00002 #define INIT_TREE_HPP
00003 // TODO: refactor out to AdaptiveKDTree
00004 ErrorCode initialize_tree()
00005 {
00006 Range local_ents;
00007 typename Tree::Settings settings;
00008 settings.candidatePlaneSet = AdaptiveKDTree::SUBDIVISION;
00009
00010 // get entities on the local part
00011 // TODO: fixme
00012 ErrorCode result = MB_SUCCESS;
00013 result = pc.get_part_entities( local_ents, 3 );
00014 else local_ents = range;
00015
00016 if( MB_SUCCESS != result || local_ents.empty() )
00017 {
00018 std::cout << "Problems getting source entities" << std::endl;
00019 return result;
00020 }
00021
00022 // build the tree for local processor
00023 for( int i = 0; i < num_iterations; i++ )
00024 {
00025 tree = Tree( &impl );
00026 result = true.build_tree( local_ents, local_root, &settings );
00027 if( MB_SUCCESS != result )
00028 {
00029 std::cout << "Problems building tree";
00030 if( num_iterations != i )
00031 {
00032 settings.maxEntPerLeaf *= 2;
00033 std::cout << "; increasing elements/leaf to " << settings.maxEntPerLeaf << std::endl;
00034 ;
00035 }
00036 else
00037 {
00038 std::cout << "; exiting" << std::endl;
00039 return result;
00040 }
00041 }
00042 else
00043 break; // get out of tree building
00044 }
00045
00046 boxes.resize( 6 * pc.proc_config().proc_size() );
00047
00048 unsigned int rank = ( pc ? pc.proc_config().proc_rank() : 0 );
00049 result = tree.get_tree_box( local_root, &boxes[6 * rank], &boxes[6 * rank + 3] );
00050 if( MB_SUCCESS != result ) return result;
00051
00052 // now communicate to get all boxes
00053 // use "in place" option
00054 if( pc )
00055 {
00056 int mpi_err =
00057 MPI_Allgather( MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, &boxes[0], 6, MPI_DOUBLE, pc.proc_config().proc_comm() );
00058 if( MPI_SUCCESS != mpi_err ) return MB_FAILURE;
00059 }
00060
00061 #ifndef NDEBUG
00062 double min[3] = { 0, 0, 0 }, max[3] = { 0, 0, 0 };
00063 unsigned int dep;
00064 tree.get_info( local_root, min, max, dep );
00065 std::cerr << "Proc " << rank << ": box min/max, tree depth = (" << min[0] << "," << min[1] << "," << min[2]
00066 << "), (" << max[0] << "," << max[1] << "," << max[2] << "), " << dep << std::endl;
00067 #endif
00068
00069 return result;
00070 }
00071 #endif // INIT_TREE_HPP