#include #include #include #include #include //Input function void fn_input(double* coord, int n, double* out){ double a=-160; for(int i=0;i& kernel_fn=pvfmm::laplace_potn_d; // Construct tree. size_t max_pts=100; std::vector trg_coord=point_distrib(RandUnif,N,comm); pvfmm::ChebFMM_Tree* tree=ChebFMM_CreateTree(cheb_deg, kernel_fn.ker_dim[0], fn_input, trg_coord, comm, tol, max_pts, pvfmm::FreeSpace); // Load matrices. pvfmm::ChebFMM matrices; matrices.Initialize(mult_order, cheb_deg, comm, &kernel_fn); // FMM Setup tree->SetupFMM(&matrices); // Run FMM std::vector trg_value; size_t n_trg=trg_coord.size()/COORD_DIM; pvfmm::ChebFMM_Evaluate(tree, trg_value, n_trg); // Re-run FMM tree->ClearFMMData(); pvfmm::ChebFMM_Evaluate(tree, trg_value, n_trg); {// Check error std::vector trg_value_(n_trg*kernel_fn.ker_dim[1]); fn_output(&trg_coord[0],n_trg,&trg_value_[0]); double max_err=0; double max_err_glb=0; for(size_t i=0;imax_err) max_err=fabs(trg_value_[i]-trg_value[i]); } MPI_Reduce(&max_err, &max_err_glb, 1, MPI_DOUBLE, MPI_MAX, 0, comm); int rank; MPI_Comm_rank(comm, &rank); if(!rank) std::cout<<"Maximum Error:"< = (1) : Number of OpenMP threads." ))); size_t N=(size_t)strtod(commandline_option(argc, argv, "-N", "1", true, "-N : Number of target points." ),NULL); int m= strtoul(commandline_option(argc, argv, "-m", "10", false, "-m = (10) : Multipole order (+ve even integer)."),NULL,10); int q= strtoul(commandline_option(argc, argv, "-q", "14", false, "-q = (14) : Chebyshev order (+ve integer)." ),NULL,10); double tol= strtod(commandline_option(argc, argv, "-tol", "1e-5", false, "-tol = (1e-5) : Tolerance for adaptive refinement." ),NULL); commandline_option_end(argc, argv); pvfmm::Profile::Enable(true); // Run FMM with above options. fmm_test(N, m,q, tol, comm); //Output Profiling results. pvfmm::Profile::print(&comm); // Shut down MPI MPI_Finalize(); return 0; }