17 #include <Compadre_Config.h>
25 #ifdef COMPADRE_USE_MPI
29 #include <Kokkos_Timer.hpp>
30 #include <Kokkos_Core.hpp>
32 using namespace Compadre;
37 int main (
int argc,
char* args[]) {
40 #ifdef COMPADRE_USE_MPI
41 MPI_Init(&argc, &args);
45 Kokkos::initialize(argc, args);
52 auto order = clp.
order;
66 Kokkos::Profiling::pushRegion(
"Setup Point Data");
71 Kokkos::View<double**, Kokkos::DefaultExecutionSpace> source_coords_device(
"source coordinates",
72 1.25*N_pts_on_sphere, 3);
73 Kokkos::View<double**>::HostMirror source_coords = Kokkos::create_mirror_view(source_coords_device);
78 int number_source_coords;
83 double a = 4*
PI*r*r/N_pts_on_sphere;
84 double d = std::sqrt(a);
85 int M_theta = std::round(
PI/d);
86 double d_theta =
PI/M_theta;
87 double d_phi = a/d_theta;
88 for (
int i=0; i<M_theta; ++i) {
89 double theta =
PI*(i + 0.5)/M_theta;
90 int M_phi = std::round(2*
PI*std::sin(theta)/d_phi);
91 for (
int j=0; j<M_phi; ++j) {
92 double phi = 2*
PI*j/M_phi;
93 source_coords(N_count, 0) = theta;
94 source_coords(N_count, 1) = phi;
99 for (
int i=0; i<N_count; ++i) {
100 double theta = source_coords(i,0);
101 double phi = source_coords(i,1);
102 source_coords(i,0) = r*std::sin(theta)*std::cos(phi);
103 source_coords(i,1) = r*std::sin(theta)*std::sin(phi);
104 source_coords(i,2) = r*cos(theta);
107 number_source_coords = N_count;
111 Kokkos::resize(source_coords, number_source_coords, 3);
112 Kokkos::resize(source_coords_device, number_source_coords, 3);
115 Kokkos::View<double**, Kokkos::DefaultExecutionSpace> target_coords_device(
"target coordinates",
116 number_target_coords, 3);
117 Kokkos::View<double**>::HostMirror target_coords = Kokkos::create_mirror_view(target_coords_device);
120 std::mt19937 rng(50);
123 std::uniform_int_distribution<int> gen_num_neighbors(0, number_source_coords-1);
126 for (
int i=0; i<number_target_coords; ++i) {
127 const int source_site_to_copy = gen_num_neighbors(rng);
128 for (
int j=0; j<3; ++j) {
129 target_coords(i,j) = source_coords(source_site_to_copy,j);
136 Kokkos::Profiling::popRegion();
138 Kokkos::Profiling::pushRegion(
"Creating Data");
144 Kokkos::deep_copy(source_coords_device, source_coords);
145 Kokkos::deep_copy(target_coords_device, target_coords);
152 Kokkos::View<double*, Kokkos::DefaultExecutionSpace> sampling_data_device(
"samples of true solution",
153 source_coords_device.extent(0));
156 Kokkos::View<double**, Kokkos::DefaultExecutionSpace> sampling_vector_data_device(
"samples of vector true solution",
157 source_coords_device.extent(0), 3);
159 Kokkos::parallel_for(
"Sampling Manufactured Solutions", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>
160 (0,source_coords.extent(0)), KOKKOS_LAMBDA(
const int i) {
163 double xval = source_coords_device(i,0);
164 double yval = (dimension>1) ? source_coords_device(i,1) : 0;
165 double zval = (dimension>2) ? source_coords_device(i,2) : 0;
171 for (
int j=0; j<3; ++j) {
172 double gradient[3] = {0,0,0};
174 sampling_vector_data_device(i,j) = gradient[j];
182 Kokkos::Profiling::popRegion();
183 Kokkos::Profiling::pushRegion(
"Neighbor Search");
194 double epsilon_multiplier = 1.5;
195 int estimated_upper_bound_number_neighbors =
196 point_cloud_search.getEstimatedNumberNeighborsUpperBound(min_neighbors, dimension, epsilon_multiplier);
198 Kokkos::View<int**, Kokkos::DefaultExecutionSpace> neighbor_lists_device(
"neighbor lists",
199 number_target_coords, estimated_upper_bound_number_neighbors);
200 Kokkos::View<int**>::HostMirror neighbor_lists = Kokkos::create_mirror_view(neighbor_lists_device);
203 Kokkos::View<double*, Kokkos::DefaultExecutionSpace> epsilon_device(
"h supports", number_target_coords);
204 Kokkos::View<double*>::HostMirror epsilon = Kokkos::create_mirror_view(epsilon_device);
209 point_cloud_search.generate2DNeighborListsFromKNNSearch(
false , target_coords, neighbor_lists,
210 epsilon, min_neighbors, epsilon_multiplier);
215 Kokkos::Profiling::popRegion();
226 Kokkos::deep_copy(neighbor_lists_device, neighbor_lists);
227 Kokkos::deep_copy(epsilon_device, epsilon);
233 solver_name.c_str(), problem_name.c_str(), constraint_name.c_str(),
250 my_GMLS_vector_1.
setProblemData(neighbor_lists_device, source_coords_device, target_coords_device, epsilon_device);
253 std::vector<TargetOperation> lro_vector_1(1);
257 my_GMLS_vector_1.addTargets(lro_vector_1);
263 my_GMLS_vector_1.setCurvatureWeightingParameter(2);
269 my_GMLS_vector_1.setWeightingParameter(2);
272 my_GMLS_vector_1.setOrderOfQuadraturePoints(2);
273 my_GMLS_vector_1.setDimensionOfQuadraturePoints(1);
274 my_GMLS_vector_1.setQuadratureType(
"LINE");
277 my_GMLS_vector_1.generateAlphas();
284 solver_name.c_str(), problem_name.c_str(), constraint_name.c_str(),
287 my_GMLS_vector_2.
setProblemData(neighbor_lists_device, source_coords_device, target_coords_device, epsilon_device);
288 std::vector<TargetOperation> lro_vector_2(2);
292 my_GMLS_vector_2.addTargets(lro_vector_2);
294 my_GMLS_vector_2.setCurvatureWeightingParameter(2);
296 my_GMLS_vector_2.setWeightingParameter(2);
297 my_GMLS_vector_2.setOrderOfQuadraturePoints(2);
298 my_GMLS_vector_2.setDimensionOfQuadraturePoints(1);
299 my_GMLS_vector_2.setQuadratureType(
"LINE");
300 my_GMLS_vector_2.generateAlphas();
306 solver_name.c_str(), problem_name.c_str(), constraint_name.c_str(),
309 my_GMLS_scalar.
setProblemData(neighbor_lists_device, source_coords_device, target_coords_device, epsilon_device);
311 std::vector<TargetOperation> lro_scalar(1);
314 my_GMLS_scalar.addTargets(lro_scalar);
316 my_GMLS_scalar.setCurvatureWeightingParameter(2);
318 my_GMLS_scalar.setWeightingParameter(2);
319 my_GMLS_scalar.generateAlphas();
324 double instantiation_time = timer.seconds();
325 std::cout <<
"Took " << instantiation_time <<
"s to complete alphas generation." << std::endl;
327 Kokkos::Profiling::pushRegion(
"Apply Alphas to Data");
342 Evaluator vector_1_gmls_evaluator(&my_GMLS_vector_1);
343 Evaluator vector_2_gmls_evaluator(&my_GMLS_vector_2);
344 Evaluator scalar_gmls_evaluator(&my_GMLS_scalar);
355 auto output_divergence_vectorsamples =
359 auto output_divergence_scalarsamples =
363 auto output_laplacian_vectorbasis =
367 auto output_laplacian_scalarbasis =
375 Kokkos::Profiling::popRegion();
377 Kokkos::Profiling::pushRegion(
"Comparison");
381 double laplacian_vectorbasis_error = 0;
382 double laplacian_vectorbasis_norm = 0;
384 double laplacian_scalarbasis_error = 0;
385 double laplacian_scalarbasis_norm = 0;
387 double gradient_vectorbasis_ambient_error = 0;
388 double gradient_vectorbasis_ambient_norm = 0;
390 double gradient_scalarbasis_ambient_error = 0;
391 double gradient_scalarbasis_ambient_norm = 0;
393 double divergence_vectorsamples_ambient_error = 0;
394 double divergence_vectorsamples_ambient_norm = 0;
396 double divergence_scalarsamples_ambient_error = 0;
397 double divergence_scalarsamples_ambient_norm = 0;
400 for (
int i=0; i<number_target_coords; i++) {
403 double xval = target_coords(i,0);
404 double yval = (dimension>1) ? target_coords(i,1) : 0;
405 double zval = (dimension>2) ? target_coords(i,2) : 0;
409 double actual_Gradient_ambient[3] = {0,0,0};
412 laplacian_vectorbasis_error += (output_laplacian_vectorbasis(i) - actual_Laplacian)*(output_laplacian_vectorbasis(i) - actual_Laplacian);
413 laplacian_vectorbasis_norm += actual_Laplacian*actual_Laplacian;
416 laplacian_scalarbasis_error += (output_laplacian_scalarbasis(i) - actual_Laplacian)*(output_laplacian_scalarbasis(i) - actual_Laplacian);
417 laplacian_scalarbasis_norm += actual_Laplacian*actual_Laplacian;
432 divergence_vectorsamples_ambient_error += (output_divergence_vectorsamples(i) - actual_Laplacian)*(output_divergence_vectorsamples(i) - actual_Laplacian);
433 divergence_vectorsamples_ambient_norm += actual_Laplacian*actual_Laplacian;
435 divergence_scalarsamples_ambient_error += (output_divergence_scalarsamples(i) - actual_Laplacian)*(output_divergence_scalarsamples(i) - actual_Laplacian);
436 divergence_scalarsamples_ambient_norm += actual_Laplacian*actual_Laplacian;
440 laplacian_vectorbasis_error /= number_target_coords;
441 laplacian_vectorbasis_error = std::sqrt(laplacian_vectorbasis_error);
442 laplacian_vectorbasis_norm /= number_target_coords;
443 laplacian_vectorbasis_norm = std::sqrt(laplacian_vectorbasis_norm);
445 laplacian_scalarbasis_error /= number_target_coords;
446 laplacian_scalarbasis_error = std::sqrt(laplacian_scalarbasis_error);
447 laplacian_scalarbasis_norm /= number_target_coords;
448 laplacian_scalarbasis_norm = std::sqrt(laplacian_scalarbasis_norm);
450 gradient_vectorbasis_ambient_error /= number_target_coords;
451 gradient_vectorbasis_ambient_error = std::sqrt(gradient_vectorbasis_ambient_error);
452 gradient_vectorbasis_ambient_norm /= number_target_coords;
453 gradient_vectorbasis_ambient_norm = std::sqrt(gradient_vectorbasis_ambient_norm);
455 gradient_scalarbasis_ambient_error /= number_target_coords;
456 gradient_scalarbasis_ambient_error = std::sqrt(gradient_scalarbasis_ambient_error);
457 gradient_scalarbasis_ambient_norm /= number_target_coords;
458 gradient_scalarbasis_ambient_norm = std::sqrt(gradient_scalarbasis_ambient_norm);
460 divergence_vectorsamples_ambient_error /= number_target_coords;
461 divergence_vectorsamples_ambient_error = std::sqrt(divergence_vectorsamples_ambient_error);
462 divergence_vectorsamples_ambient_norm /= number_target_coords;
463 divergence_vectorsamples_ambient_norm = std::sqrt(divergence_vectorsamples_ambient_norm);
465 divergence_scalarsamples_ambient_error /= number_target_coords;
466 divergence_scalarsamples_ambient_error = std::sqrt(divergence_scalarsamples_ambient_error);
467 divergence_scalarsamples_ambient_norm /= number_target_coords;
468 divergence_scalarsamples_ambient_norm = std::sqrt(divergence_scalarsamples_ambient_norm);
470 printf(
"Staggered Laplace-Beltrami (VectorBasis) Error: %g\n", laplacian_vectorbasis_error / laplacian_vectorbasis_norm);
471 printf(
"Staggered Laplace-Beltrami (ScalarBasis) Error: %g\n", laplacian_scalarbasis_error / laplacian_scalarbasis_norm);
472 printf(
"Surface Staggered Gradient (VectorBasis) Error: %g\n", gradient_vectorbasis_ambient_error / gradient_vectorbasis_ambient_norm);
473 printf(
"Surface Staggered Gradient (ScalarBasis) Error: %g\n", gradient_scalarbasis_ambient_error / gradient_scalarbasis_ambient_norm);
474 printf(
"Surface Staggered Divergence (VectorSamples) Error: %g\n", divergence_vectorsamples_ambient_error / divergence_vectorsamples_ambient_norm);
475 printf(
"Surface Staggered Divergence (ScalarSamples) Error: %g\n", divergence_scalarsamples_ambient_error / divergence_scalarsamples_ambient_norm);
479 Kokkos::Profiling::popRegion();
488 #ifdef COMPADRE_USE_MPI
KOKKOS_INLINE_FUNCTION double sphere_harmonic54(double x, double y, double z)
Lightweight Evaluator Helper This class is a lightweight wrapper for extracting and applying all rele...
PointCloudSearch< view_type > CreatePointCloudSearch(view_type src_view, const local_index_type dimensions=-1, const local_index_type max_leaf=-1)
CreatePointCloudSearch allows for the construction of an object of type PointCloudSearch with templat...
int main(int argc, char **argv)
Vector polynomial basis having # of components _dimensions, or (_dimensions-1) in the case of manifol...
constexpr SamplingFunctional StaggeredEdgeAnalyticGradientIntegralSample
Analytical integral of a gradient source vector is just a difference of the scalar source at neighbor...
static KOKKOS_INLINE_FUNCTION int getNP(const int m, const int dimension=3, const ReconstructionSpace r_space=ReconstructionSpace::ScalarTaylorPolynomial)
Returns size of the basis for a given polynomial order and dimension General to dimension 1...
constexpr SamplingFunctional StaggeredEdgeIntegralSample
Samples consist of the result of integrals of a vector dotted with the tangent along edges between ne...
Scalar polynomial basis centered at the target site and scaled by sum of basis powers e...
import subprocess import os import re import math import sys import argparse d d d
Point evaluation of the divergence of a vector (results in a scalar)
KOKKOS_INLINE_FUNCTION void gradient_sphereHarmonic54_ambient(double *gradient, double x, double y, double z)
Generalized Moving Least Squares (GMLS)
Kokkos::View< output_data_type, output_array_layout, output_memory_space > applyAlphasToDataAllComponentsAllTargetSites(view_type_input_data sampling_data, TargetOperation lro, const SamplingFunctional sro_in=PointSample, bool scalar_as_vector_if_needed=true, const int evaluation_site_local_index=0) const
Transformation of data under GMLS (allocates memory for output)
void setProblemData(view_type_1 neighbor_lists, view_type_2 source_coordinates, view_type_3 target_coordinates, view_type_4 epsilons)
Sets basic problem data (neighbor lists, source coordinates, and target coordinates) ...
KOKKOS_INLINE_FUNCTION double laplace_beltrami_sphere_harmonic54(double x, double y, double z)
std::string constraint_name
Point evaluation of the chained staggered Laplacian acting on VectorTaylorPolynomial basis + Staggere...