|  | @@ -386,50 +386,19 @@ void fmm_test(int test_case, size_t N, size_t M, bool unif, int mult_order, int
 | 
											
												
													
														|  |    CheckChebOutput<FMM_Tree_t>(tree, (typename TestFn<Real_t>::Fn_t) fn_input_, mykernel->ker_dim[0], std::string("Input"));
 |  |    CheckChebOutput<FMM_Tree_t>(tree, (typename TestFn<Real_t>::Fn_t) fn_input_, mykernel->ker_dim[0], std::string("Input"));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |    for(size_t iter=0;iter<6;iter++){ // Load balance.
 |  |    for(size_t iter=0;iter<6;iter++){ // Load balance.
 | 
											
												
													
														|  | -    { //Output max, min tree size.
 |  | 
 | 
											
												
													
														|  | -      long node_cnt=0;
 |  | 
 | 
											
												
													
														|  | -      std::vector<FMMNode_t*>& nodes=tree->GetNodeList();
 |  | 
 | 
											
												
													
														|  | -      for(size_t i=0;i<nodes.size();i++){
 |  | 
 | 
											
												
													
														|  | -        FMMNode_t* n=nodes[i];
 |  | 
 | 
											
												
													
														|  | -        if(!n->IsGhost() && n->IsLeaf()) node_cnt++;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<"MAX, MIN Nodes: ";
 |  | 
 | 
											
												
													
														|  | -      long max=0;
 |  | 
 | 
											
												
													
														|  | -      long min=0;
 |  | 
 | 
											
												
													
														|  | -      MPI_Allreduce(&node_cnt, &max, 1, MPI_LONG, MPI_MAX, comm);
 |  | 
 | 
											
												
													
														|  | -      MPI_Allreduce(&node_cnt, &min, 1, MPI_LONG, MPI_MIN, comm);
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<max<<' ';
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<min<<'\n';
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    tree->RedistNodes();
 |  | 
 | 
											
												
													
														|  | -    { //Output max, min tree size.
 |  | 
 | 
											
												
													
														|  | -      long node_cnt=0;
 |  | 
 | 
											
												
													
														|  | -      std::vector<FMMNode_t*>& nodes=tree->GetNodeList();
 |  | 
 | 
											
												
													
														|  | -      for(size_t i=0;i<nodes.size();i++){
 |  | 
 | 
											
												
													
														|  | -        FMMNode_t* n=nodes[i];
 |  | 
 | 
											
												
													
														|  | -        if(!n->IsGhost() && n->IsLeaf()) node_cnt++;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<"MAX, MIN Nodes: ";
 |  | 
 | 
											
												
													
														|  | -      long max=0;
 |  | 
 | 
											
												
													
														|  | -      long min=0;
 |  | 
 | 
											
												
													
														|  | -      MPI_Allreduce(&node_cnt, &max, 1, MPI_LONG, MPI_MAX, comm);
 |  | 
 | 
											
												
													
														|  | -      MPI_Allreduce(&node_cnt, &min, 1, MPI_LONG, MPI_MIN, comm);
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<max<<' ';
 |  | 
 | 
											
												
													
														|  | -      if(!myrank) std::cout<<min<<'\n';
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Setup FMM
 | 
											
												
													
														|  |      tree->SetupFMM(fmm_mat);
 |  |      tree->SetupFMM(fmm_mat);
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |      tree->RunFMM();
 |  |      tree->RunFMM();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //Re-run and time
 | 
											
												
													
														|  |      MPI_Barrier(comm);
 |  |      MPI_Barrier(comm);
 | 
											
												
													
														|  |      double tt=-omp_get_wtime();
 |  |      double tt=-omp_get_wtime();
 | 
											
												
													
														|  |      tree->RunFMM();
 |  |      tree->RunFMM();
 | 
											
												
													
														|  |      tt+=omp_get_wtime();
 |  |      tt+=omp_get_wtime();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    { // Set weights
 |  | 
 | 
											
												
													
														|  | -      std::vector<FMMNode_t*> nlist=tree->GetNodeList();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    { // Redistribute
 | 
											
												
													
														|  |        size_t node_cnt=0;
 |  |        size_t node_cnt=0;
 | 
											
												
													
														|  | 
 |  | +      std::vector<FMMNode_t*> nlist=tree->GetNodeList();
 | 
											
												
													
														|  |        for(size_t i=0;i<nlist.size();i++){
 |  |        for(size_t i=0;i<nlist.size();i++){
 | 
											
												
													
														|  |          if(nlist[i]->IsLeaf() && !nlist[i]->IsGhost())
 |  |          if(nlist[i]->IsLeaf() && !nlist[i]->IsGhost())
 | 
											
												
													
														|  |            node_cnt++;
 |  |            node_cnt++;
 | 
											
										
											
												
													
														|  | @@ -437,9 +406,47 @@ void fmm_test(int test_case, size_t N, size_t M, bool unif, int mult_order, int
 | 
											
												
													
														|  |        for(size_t i=0;i<nlist.size();i++){
 |  |        for(size_t i=0;i<nlist.size();i++){
 | 
											
												
													
														|  |          nlist[i]->NodeCost()=(tt*100000000)/node_cnt;
 |  |          nlist[i]->NodeCost()=(tt*100000000)/node_cnt;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      { //Output max, min tree size.
 | 
											
												
													
														|  | 
 |  | +        long node_cnt=0;
 | 
											
												
													
														|  | 
 |  | +        std::vector<FMMNode_t*>& nodes=tree->GetNodeList();
 | 
											
												
													
														|  | 
 |  | +        for(size_t i=0;i<nodes.size();i++){
 | 
											
												
													
														|  | 
 |  | +          FMMNode_t* n=nodes[i];
 | 
											
												
													
														|  | 
 |  | +          if(!n->IsGhost() && n->IsLeaf()) node_cnt++;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<"MAX, MIN Nodes: ";
 | 
											
												
													
														|  | 
 |  | +        long max=0;
 | 
											
												
													
														|  | 
 |  | +        long min=0;
 | 
											
												
													
														|  | 
 |  | +        MPI_Allreduce(&node_cnt, &max, 1, MPI_LONG, MPI_MAX, comm);
 | 
											
												
													
														|  | 
 |  | +        MPI_Allreduce(&node_cnt, &min, 1, MPI_LONG, MPI_MIN, comm);
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<max<<' ';
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<min<<'\n';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      tree->RedistNodes();
 | 
											
												
													
														|  | 
 |  | +      { //Output max, min tree size.
 | 
											
												
													
														|  | 
 |  | +        long node_cnt=0;
 | 
											
												
													
														|  | 
 |  | +        std::vector<FMMNode_t*>& nodes=tree->GetNodeList();
 | 
											
												
													
														|  | 
 |  | +        for(size_t i=0;i<nodes.size();i++){
 | 
											
												
													
														|  | 
 |  | +          FMMNode_t* n=nodes[i];
 | 
											
												
													
														|  | 
 |  | +          if(!n->IsGhost() && n->IsLeaf()) node_cnt++;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<"MAX, MIN Nodes: ";
 | 
											
												
													
														|  | 
 |  | +        long max=0;
 | 
											
												
													
														|  | 
 |  | +        long min=0;
 | 
											
												
													
														|  | 
 |  | +        MPI_Allreduce(&node_cnt, &max, 1, MPI_LONG, MPI_MAX, comm);
 | 
											
												
													
														|  | 
 |  | +        MPI_Allreduce(&node_cnt, &min, 1, MPI_LONG, MPI_MIN, comm);
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<max<<' ';
 | 
											
												
													
														|  | 
 |  | +        if(!myrank) std::cout<<min<<'\n';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +  // Setup FMM
 | 
											
												
													
														|  | 
 |  | +  tree->SetupFMM(fmm_mat);
 | 
											
												
													
														|  | 
 |  | +  tree->RunFMM();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |    //Re-run FMM
 |  |    //Re-run FMM
 | 
											
												
													
														|  |    tree->ClearFMMData();
 |  |    tree->ClearFMMData();
 | 
											
												
													
														|  |    tree->RunFMM();
 |  |    tree->RunFMM();
 | 
											
										
											
												
													
														|  | @@ -511,7 +518,7 @@ int main(int argc, char **argv){
 | 
											
												
													
														|  |      MPI_Allreduce(&t, &tt, 1, pvfmm::par::Mpi_datatype<double>::value(), MPI_SUM, comm_);
 |  |      MPI_Allreduce(&t, &tt, 1, pvfmm::par::Mpi_datatype<double>::value(), MPI_SUM, comm_);
 | 
											
												
													
														|  |      tt=tt/np;
 |  |      tt=tt/np;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    int clr=(t<tt*1.1?0:1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    int clr=(t<tt*1.5?0:1);
 | 
											
												
													
														|  |      MPI_Comm_split(comm_, clr, myrank, &comm );
 |  |      MPI_Comm_split(comm_, clr, myrank, &comm );
 | 
											
												
													
														|  |      if(clr){
 |  |      if(clr){
 | 
											
												
													
														|  |        MPI_Finalize();
 |  |        MPI_Finalize();
 |