29 if (data._dimensions > 1) {
32 || data._data_sampling_multiplier!=0
34 && data._polynomial_sampling_functional==
PointSample))
35 &&
"data._reconstruction_space(VectorOfScalar clones incompatible with scalar output sampling functional which is not a PointSample");
39 bool additional_evaluation_sites_need_handled =
40 (data._additional_pc._source_coordinates.extent(0) > 0) ?
true :
false;
42 const int target_index = data._initial_index_for_batch + teamMember.league_rank();
44 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, P_target_row.extent(0)), [&] (
const int j) {
45 Kokkos::parallel_for(Kokkos::ThreadVectorRange(teamMember, P_target_row.extent(1)),
47 P_target_row(j,k) = 0;
50 for (
int j = 0; j < delta.extent_int(0); ++j) {
53 for (
int j = 0; j < thread_workspace.extent_int(0); ++j) {
54 thread_workspace(j) = 0;
56 teamMember.team_barrier();
59 int target_NP =
GMLS::getNP(data._poly_order, data._dimensions, data._reconstruction_space);
60 const int num_evaluation_sites = data._additional_pc._nla.getNumberOfNeighborsDevice(target_index) + 1;
62 for (
size_t i=0; i<data._operations.size(); ++i) {
64 bool additional_evaluation_sites_handled =
false;
66 bool operation_handled =
true;
73 if (!operation_handled) {
82 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
83 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
84 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
85 for (
int k=0; k<target_NP; ++k) {
86 P_target_row(offset, k) = delta(k);
89 additional_evaluation_sites_handled =
true;
91 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
92 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
93 switch (data._dimensions) {
95 P_target_row(offset, 4) = std::pow(data._epsilons(target_index), -2);
96 P_target_row(offset, 6) = std::pow(data._epsilons(target_index), -2);
97 P_target_row(offset, 9) = std::pow(data._epsilons(target_index), -2);
100 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -2);
101 P_target_row(offset, 5) = std::pow(data._epsilons(target_index), -2);
104 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -2);
108 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
109 for (
int d=0; d<data._dimensions; ++d) {
110 int offset = data._d_ss.getTargetOffsetIndex(i, 0, d, j);
111 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
112 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , d , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
115 additional_evaluation_sites_handled =
true;
117 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
118 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
119 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
120 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 0 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
122 additional_evaluation_sites_handled =
true;
125 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
126 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
127 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
128 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
130 additional_evaluation_sites_handled =
true;
133 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
134 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
135 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
136 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
138 additional_evaluation_sites_handled =
true;
144 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
145 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
146 switch (data._dimensions) {
148 P_target_row(offset, 4) = std::pow(data._epsilons(target_index), -2);
149 P_target_row(offset, 6) = std::pow(data._epsilons(target_index), -2);
150 P_target_row(offset, 9) = std::pow(data._epsilons(target_index), -2);
153 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -2);
154 P_target_row(offset, 5) = std::pow(data._epsilons(target_index), -2);
157 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -2);
163 "CellAverageEvaluation and CellIntegralEvaluation only support 2d or 3d with 2d manifold");
164 const double factorial[15] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200};
165 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
168 double cutoff_p = data._epsilons(target_index);
172 double triangle_coords[3*3];
175 for (
int j=0; j<data._global_dimensions; ++j) {
177 triangle_coords_matrix(j, 0) = data._pc.getTargetCoordinate(target_index, j);
180 size_t num_vertices = (data._target_extra_data(target_index, data._target_extra_data.extent(1)-1)
181 != data._target_extra_data(target_index, data._target_extra_data.extent(1)-1))
182 ? (data._target_extra_data.extent(1) / data._global_dimensions) - 1 :
183 (data._target_extra_data.extent(1) / data._global_dimensions);
187 double entire_cell_area = 0.0;
188 for (
size_t v=0; v<num_vertices; ++v) {
190 int v2 = (v+1) % num_vertices;
192 for (
int j=0; j<data._global_dimensions; ++j) {
193 triangle_coords_matrix(j,1) = data._target_extra_data(target_index, v1*data._global_dimensions+j)
194 - triangle_coords_matrix(j,0);
195 triangle_coords_matrix(j,2) = data._target_extra_data(target_index, v2*data._global_dimensions+j)
196 - triangle_coords_matrix(j,0);
202 auto T=triangle_coords_matrix;
203 for (
int quadrature = 0; quadrature<data._qm.getNumberOfQuadraturePoints(); ++quadrature) {
204 double transformed_qp[2] = {0,0};
205 for (
int j=0; j<data._global_dimensions; ++j) {
206 for (
int k=1; k<3; ++k) {
207 transformed_qp[j] += T(j,k)*data._qm.getSite(quadrature, k-1);
209 transformed_qp[j] += T(j,0);
214 Kokkos::subview(T, Kokkos::ALL(), 1), Kokkos::subview(T, Kokkos::ALL(), 2));
216 for (
int j=0; j<data._global_dimensions; ++j) {
217 relative_coord[j] = transformed_qp[j] - data._pc.getTargetCoordinate(target_index, j);
221 for (
int n = 0; n <= data._poly_order; n++){
222 for (alphay = 0; alphay <= n; alphay++){
224 alphaf = factorial[alphax]*factorial[alphay];
225 double val_to_sum = G_determinant * ( data._qm.getWeight(quadrature)
226 * std::pow(relative_coord.x/cutoff_p,alphax)
227 * std::pow(relative_coord.y/cutoff_p,alphay)/alphaf);
228 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
229 if (quadrature==0 && v==0) P_target_row(offset, k) = val_to_sum;
230 else P_target_row(offset, k) += val_to_sum;
235 entire_cell_area += G_determinant * data._qm.getWeight(quadrature);
240 for (
int n = 0; n <= data._poly_order; n++){
241 for (alphay = 0; alphay <= n; alphay++){
242 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
243 P_target_row(offset, k) /= entire_cell_area;
265 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
266 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
267 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
268 for (
int k=0; k<target_NP; ++k) {
269 P_target_row(offset, k) = delta(k);
272 additional_evaluation_sites_handled =
true;
274 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
275 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
276 for (
int m=0; m<data._sampling_multiplier; ++m) {
277 int output_components = data._basis_multiplier;
278 for (
int c=0; c<output_components; ++c) {
279 int offset = data._d_ss.getTargetOffsetIndex(i, m , c , e);
283 for (
int j=0; j<target_NP; ++j) {
284 P_target_row(offset, c*target_NP + j) = delta(j);
289 additional_evaluation_sites_handled =
true;
293 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
294 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
295 for (
int m=0; m<data._sampling_multiplier; ++m) {
296 int output_components = data._basis_multiplier;
297 for (
int c=0; c<output_components; ++c) {
298 int offset = data._d_ss.getTargetOffsetIndex(i, m , c , e);
302 for (
int j=0; j<target_NP; ++j) {
303 P_target_row(offset, c*target_NP + j) = delta(j);
308 additional_evaluation_sites_handled =
true;
310 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
311 int output_components = data._basis_multiplier;
312 for (
int m2=0; m2<output_components; ++m2) {
313 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , m2 , e);
314 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , m2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
315 for (
int j=0; j<target_NP; ++j) {
316 P_target_row(offset, j) = delta(j);
320 additional_evaluation_sites_handled =
true;
322 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
323 for (
int m0=0; m0<data._sampling_multiplier; ++m0) {
324 int output_components = data._basis_multiplier;
325 for (
int m1=0; m1<output_components; ++m1) {
326 for (
int m2=0; m2<output_components; ++m2) {
327 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1*output_components+m2 , e);
328 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , m2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
329 for (
int j=0; j<target_NP; ++j) {
330 P_target_row(offset, m1*target_NP + j) = delta(j);
336 additional_evaluation_sites_handled =
true;
339 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
340 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);;
341 switch (data._dimensions) {
343 P_target_row(offset, 1) = std::pow(data._epsilons(target_index), -1);
344 P_target_row(offset, target_NP + 2) = std::pow(data._epsilons(target_index), -1);
345 P_target_row(offset, 2*target_NP + 3) = std::pow(data._epsilons(target_index), -1);
348 P_target_row(offset, 1) = std::pow(data._epsilons(target_index), -1);
349 P_target_row(offset, target_NP + 2) = std::pow(data._epsilons(target_index), -1);
352 P_target_row(offset, 1) = std::pow(data._epsilons(target_index), -1);
356 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
357 for (
int m=0; m<data._sampling_multiplier; ++m) {
358 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , m , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
359 int offset = data._d_ss.getTargetOffsetIndex(i, m , 0 , e);
360 for (
int j=0; j<target_NP; ++j) {
361 P_target_row(offset, m*target_NP + j) = delta(j);
365 additional_evaluation_sites_handled =
true;
368 if (data._dimensions==3) {
369 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
373 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , 0 , 0);
377 offset = data._d_ss.getTargetOffsetIndex(i, 1 , 0 , 0);
380 P_target_row(offset, target_NP + 3) = -std::pow(data._epsilons(target_index), -1);
382 offset = data._d_ss.getTargetOffsetIndex(i, 2 , 0 , 0);
385 P_target_row(offset, 2*target_NP + 2) = std::pow(data._epsilons(target_index), -1);
391 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , 1 , 0);
394 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -1);
400 offset = data._d_ss.getTargetOffsetIndex(i, 2 , 1 , 0);
403 P_target_row(offset, 2*target_NP + 1) = -std::pow(data._epsilons(target_index), -1);
409 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , 2 , 0);
412 P_target_row(offset, 2) = -std::pow(data._epsilons(target_index), -1);
414 offset = data._d_ss.getTargetOffsetIndex(i, 1 , 2 , 0);
417 P_target_row(offset, target_NP + 1) = std::pow(data._epsilons(target_index), -1);
424 }
else if (data._dimensions==2) {
425 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
429 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , 0 , 0);
433 offset = data._d_ss.getTargetOffsetIndex(i, 1 , 0 , 0);
436 P_target_row(offset, target_NP + 2) = std::pow(data._epsilons(target_index), -1);
442 int offset = data._d_ss.getTargetOffsetIndex(i, 0 , 1 , 0);
445 P_target_row(offset, 1) = -std::pow(data._epsilons(target_index), -1);
469 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
470 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
471 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
472 for (
int k=0; k<target_NP; ++k) {
473 P_target_row(offset, k) = delta(k);
476 additional_evaluation_sites_handled =
true;
478 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
479 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, e);
480 for (
int m=0; m<data._sampling_multiplier; ++m) {
481 for (
int c=0; c<data._data_sampling_multiplier; ++c) {
482 int offset = data._d_ss.getTargetOffsetIndex(i, c , c , e);
483 for (
int j=0; j<target_NP; ++j) {
484 P_target_row(offset, j) = delta(j);
489 additional_evaluation_sites_handled =
true;
492 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
493 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
494 switch (data._dimensions) {
496 P_target_row(offset, 4) = std::pow(data._epsilons(target_index), -2);
497 P_target_row(offset, 6) = std::pow(data._epsilons(target_index), -2);
498 P_target_row(offset, 9) = std::pow(data._epsilons(target_index), -2);
501 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -2);
502 P_target_row(offset, 5) = std::pow(data._epsilons(target_index), -2);
505 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -2);
510 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
511 for (
int d=0; d<data._dimensions; ++d) {
512 int offset = data._d_ss.getTargetOffsetIndex(i, 0, d, j);
513 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
514 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , d , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
517 additional_evaluation_sites_handled =
true;
519 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
520 for (
int m0=0; m0<data._dimensions; ++m0) {
521 for (
int m1=0; m1<data._dimensions; ++m1) {
522 for (
int m2=0; m2<data._dimensions; ++m2) {
523 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1*data._dimensions+m2 , j);
524 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
525 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , m2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
530 additional_evaluation_sites_handled =
true;
533 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
534 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
535 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
536 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 0 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
538 additional_evaluation_sites_handled =
true;
541 if (data._dimensions>1) {
542 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
543 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
544 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
545 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
547 additional_evaluation_sites_handled =
true;
551 if (data._dimensions>2) {
552 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
553 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
554 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
555 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::ScalarTaylorPolynomial,
PointSample, j);
557 additional_evaluation_sites_handled =
true;
560 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
561 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
562 for (
int j=0; j<target_NP; ++j) {
563 P_target_row(offset, j) = 0;
566 P_target_row(offset, 1) = std::pow(data._epsilons(target_index), -1);
568 if (data._dimensions>1) {
569 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
570 for (
int j=0; j<target_NP; ++j) {
571 P_target_row(offset, j) = 0;
573 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -1);
576 if (data._dimensions>2) {
577 offset = data._d_ss.getTargetOffsetIndex(i, 2, 0, 0);
578 for (
int j=0; j<target_NP; ++j) {
579 P_target_row(offset, j) = 0;
581 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -1);
588 if (data._dimensions==3) {
589 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
593 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
594 for (
int j=0; j<target_NP; ++j) {
595 P_target_row(offset, j) = 0;
600 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
601 for (
int j=0; j<target_NP; ++j) {
602 P_target_row(offset, j) = 0;
606 P_target_row(offset, 3) = -std::pow(data._epsilons(target_index), -1);
608 offset = data._d_ss.getTargetOffsetIndex(i, 2, 0, 0);
609 for (
int j=0; j<target_NP; ++j) {
610 P_target_row(offset, j) = 0;
614 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -1);
620 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, 0);
621 for (
int j=0; j<target_NP; ++j) {
622 P_target_row(offset, j) = 0;
626 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -1);
628 offset = data._d_ss.getTargetOffsetIndex(i, 1, 1, 0);
629 for (
int j=0; j<target_NP; ++j) {
630 P_target_row(offset, j) = 0;
635 offset = data._d_ss.getTargetOffsetIndex(i, 2, 1, 0);
636 for (
int j=0; j<target_NP; ++j) {
637 P_target_row(offset, j) = 0;
641 P_target_row(offset, 1) = -std::pow(data._epsilons(target_index), -1);
647 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 2, 0);
648 for (
int j=0; j<target_NP; ++j) {
649 P_target_row(offset, j) = 0;
653 P_target_row(offset, 2) = -std::pow(data._epsilons(target_index), -1);
655 offset = data._d_ss.getTargetOffsetIndex(i, 1, 2, 0);
656 for (
int j=0; j<target_NP; ++j) {
657 P_target_row(offset, j) = 0;
661 P_target_row(offset, 1) = std::pow(data._epsilons(target_index), -1);
663 offset = data._d_ss.getTargetOffsetIndex(i, 2, 2, 0);
664 for (
int j=0; j<target_NP; ++j) {
665 P_target_row(offset, j) = 0;
671 }
else if (data._dimensions==2) {
672 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
676 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
677 for (
int j=0; j<target_NP; ++j) {
678 P_target_row(offset, j) = 0;
683 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
684 for (
int j=0; j<target_NP; ++j) {
685 P_target_row(offset, j) = 0;
689 P_target_row(offset, 2) = std::pow(data._epsilons(target_index), -1);
695 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, 0);
696 for (
int j=0; j<target_NP; ++j) {
697 P_target_row(offset, j) = 0;
701 P_target_row(offset, 1) = -std::pow(data._epsilons(target_index), -1);
703 offset = data._d_ss.getTargetOffsetIndex(i, 1, 1, 0);
704 for (
int j=0; j<target_NP; ++j) {
705 P_target_row(offset, j) = 0;
728 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
729 for (
int m0=0; m0<data._sampling_multiplier; ++m0) {
730 for (
int m1=0; m1<data._sampling_multiplier; ++m1) {
732 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(m1+1) , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial,
VectorPointSample, e);
734 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1 , e );
735 for (
int j=0; j<target_NP; ++j) {
736 P_target_row(offset, j) = delta(j);
741 additional_evaluation_sites_handled =
true;
743 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
744 for (
int m0=0; m0<data._sampling_multiplier; ++m0) {
745 for (
int m1=0; m1<data._sampling_multiplier; ++m1) {
746 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1 , e );
747 if (data._dimensions==3) {
751 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
753 for (int j=0; j<target_NP; ++j) {
754 P_target_row(offset, j) = delta(j);
756 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
758 for (int j=0; j<target_NP; ++j) {
759 P_target_row(offset, j) -= delta(j);
765 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
767 for (int j=0; j<target_NP; ++j) {
768 P_target_row(offset, j) = -delta(j);
770 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
772 for (int j=0; j<target_NP; ++j) {
773 P_target_row(offset, j) += delta(j);
779 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
781 for (int j=0; j<target_NP; ++j) {
782 P_target_row(offset, j) = delta(j);
784 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
786 for (int j=0; j<target_NP; ++j) {
787 P_target_row(offset, j) -= delta(j);
795 P_target_row(offset, 2) = -std::pow(data._epsilons(target_index), -1);
796 P_target_row(offset, 3) = std::pow(data._epsilons(target_index), -1);
798 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 0 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial,
VectorPointSample, e);
800 for (
int j=0; j<target_NP; ++j) {
801 P_target_row(offset, j) = delta(j);
803 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 1 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial,
VectorPointSample, e);
805 for (
int j=0; j<target_NP; ++j) {
806 P_target_row(offset, j) -= delta(j);
814 additional_evaluation_sites_handled =
true;
816 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
817 for (
int m0=0; m0<data._sampling_multiplier; ++m0) {
818 for (
int m1=0; m1<data._sampling_multiplier; ++m1) {
819 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1 , e );
820 if (data._dimensions == 3) {
825 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 0 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
827 for (int j=0; j<target_NP; ++j) {
828 P_target_row(offset, j) = delta(j);
830 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
832 for (int j=0; j<target_NP; ++j) {
833 P_target_row(offset, j) -= delta(j);
835 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 0 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
837 for (int j=0; j<target_NP; ++j) {
838 P_target_row(offset, j) += delta(j);
840 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 2 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
842 for (int j=0; j<target_NP; ++j) {
843 P_target_row(offset, j) -= delta(j);
849 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 0 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
851 for (int j=0; j<target_NP; ++j) {
852 P_target_row(offset, j) = -delta(j);
854 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 1 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
856 for (int j=0; j<target_NP; ++j) {
857 P_target_row(offset, j) += delta(j);
859 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 1 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
861 for (int j=0; j<target_NP; ++j) {
862 P_target_row(offset, j) += delta(j);
864 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 2 , 2 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
866 for (int j=0; j<target_NP; ++j) {
867 P_target_row(offset, j) -= delta(j);
873 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 0 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
875 for (int j=0; j<target_NP; ++j) {
876 P_target_row(offset, j) = -delta(j);
878 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 2 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
880 for (int j=0; j<target_NP; ++j) {
881 P_target_row(offset, j) += delta(j);
883 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) , 1 , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
885 for (int j=0; j<target_NP; ++j) {
886 P_target_row(offset, j) -= delta(j);
888 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 2 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
890 for (int j=0; j<target_NP; ++j) {
891 P_target_row(offset, j) += delta(j);
897 if (data._dimensions == 2) {
902 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 0 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
904 for (int j=0; j<target_NP; ++j) {
905 P_target_row(offset, j) = delta(j);
907 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 1 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
909 for (int j=0; j<target_NP; ++j) {
910 P_target_row(offset, j) += delta(j);
912 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 0 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
914 for (int j=0; j<target_NP; ++j) {
915 P_target_row(offset, j) -= delta(j);
917 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
919 for (int j=0; j<target_NP; ++j) {
920 P_target_row(offset, j) -= delta(j);
926 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) , 1 , 0 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
928 for (int j=0; j<target_NP; ++j) {
929 P_target_row(offset, j) = delta(j);
931 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
933 for (int j=0; j<target_NP; ++j) {
934 P_target_row(offset, j) += delta(j);
936 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 0 , 0 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
938 for (int j=0; j<target_NP; ++j) {
939 P_target_row(offset, j) -= delta(j);
941 calcHessianPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) , 1 , 1 , 1 , data._dimensions, data._poly_order, false , NULL , ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e);
943 for (int j=0; j<target_NP; ++j) {
944 P_target_row(offset, j) -= delta(j);
953 additional_evaluation_sites_handled =
true;
955 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int e) {
956 for (
int m0=0; m0<data._sampling_multiplier; ++m0) {
957 for (
int m1=0; m1<data._sampling_multiplier; ++m1) {
958 for (
int m2=0; m2<data._sampling_multiplier; ++m2) {
959 int offset = data._d_ss.getTargetOffsetIndex(i, m0 , m1*data._sampling_multiplier+m2 , e);
960 calcGradientPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -(m1+1) , 1 , m2 , data._dimensions, data._poly_order,
false , NULL ,
ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial,
VectorPointSample, e);
961 for (
int j=0; j<target_NP; ++j) {
962 P_target_row(offset, j) = delta(j);
968 additional_evaluation_sites_handled =
true;
977 }
else if (data._reconstruction_space == ReconstructionSpace::BernsteinPolynomial) {
983 if (data._operations(i) == TargetOperation::ScalarPointEvaluation || (data._operations(i) == TargetOperation::VectorPointEvaluation && data._dimensions == 1) ) {
984 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
985 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions, data._poly_order,
false , NULL , ReconstructionSpace::BernsteinPolynomial, PointSample, j);
986 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
987 for (
int k=0; k<target_NP; ++k) {
988 P_target_row(offset, k) = delta(k);
991 additional_evaluation_sites_handled =
true;
992 }
else if (data._operations(i) == TargetOperation::GradientOfScalarPointEvaluation) {
993 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
994 for (
int d=0; d<data._dimensions; ++d) {
995 int offset = data._d_ss.getTargetOffsetIndex(i, 0, d, j);
996 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
997 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , d , data._dimensions, data._poly_order,
false , NULL , ReconstructionSpace::BernsteinPolynomial, PointSample, j);
1000 additional_evaluation_sites_handled =
true;
1001 }
else if (data._operations(i) == TargetOperation::PartialXOfScalarPointEvaluation) {
1002 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
1003 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
1004 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
1005 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 0 , data._dimensions, data._poly_order,
false , NULL , ReconstructionSpace::BernsteinPolynomial, PointSample, j);
1007 additional_evaluation_sites_handled =
true;
1008 }
else if (data._operations(i) == TargetOperation::PartialYOfScalarPointEvaluation) {
1010 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
1011 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
1012 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
1013 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 1 , data._dimensions, data._poly_order,
false , NULL , ReconstructionSpace::BernsteinPolynomial, PointSample, j);
1015 additional_evaluation_sites_handled =
true;
1016 }
else if (data._operations(i) == TargetOperation::PartialZOfScalarPointEvaluation) {
1018 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
1019 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
1020 auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL());
1021 calcGradientPij<TargetData>(data, teamMember, row.data(), thread_workspace.data(), target_index, -1 , 1 , 2 , data._dimensions, data._poly_order,
false , NULL , ReconstructionSpace::BernsteinPolynomial, PointSample, j);
1023 additional_evaluation_sites_handled =
true;
1036 (void)additional_evaluation_sites_handled;
1037 (void)additional_evaluation_sites_need_handled;
1038 compadre_kernel_assert_release(((additional_evaluation_sites_need_handled && additional_evaluation_sites_handled) || (!additional_evaluation_sites_need_handled)) &&
"Auxiliary evaluation coordinates are specified by user, but are calling a target operation that can not handle evaluating additional sites.");
1041 teamMember.team_barrier();
1128 compadre_kernel_assert_release((thread_workspace.extent_int(0)>=(data._poly_order+1)*data._local_dimensions) &&
"Workspace thread_workspace not large enough.");
1131 const int target_index = data._initial_index_for_batch + teamMember.league_rank();
1133 int target_NP = GMLS::getNP(data._poly_order, data._dimensions-1, data._reconstruction_space);
1135 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, P_target_row.extent(0)), [&] (
const int j) {
1136 Kokkos::parallel_for(Kokkos::ThreadVectorRange(teamMember, P_target_row.extent(1)),
1137 [&] (const int& k) {
1138 P_target_row(j,k) = 0;
1141 for (
int j = 0; j < delta.extent_int(0); ++j) {
1144 for (
int j = 0; j < thread_workspace.extent_int(0); ++j) {
1145 thread_workspace(j) = 0;
1147 teamMember.team_barrier();
1150 bool additional_evaluation_sites_need_handled =
1151 (data._additional_pc._source_coordinates.extent(0) > 0) ?
true : false;
1153 const int num_evaluation_sites = data._additional_pc._nla.getNumberOfNeighborsDevice(target_index) + 1;
1155 for (
size_t i=0; i<data._operations.size(); ++i) {
1157 bool additional_evaluation_sites_handled =
false;
1159 bool operation_handled =
true;
1166 if (!operation_handled) {
1167 if (data._dimensions>2) {
1168 if (data._operations(i) == TargetOperation::ScalarPointEvaluation) {
1169 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
1170 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions-1, data._poly_order,
false , &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j);
1171 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
1172 for (
int k=0; k<target_NP; ++k) {
1173 P_target_row(offset, k) = delta(k);
1176 additional_evaluation_sites_handled =
true;
1177 }
else if (data._operations(i) == TargetOperation::VectorPointEvaluation) {
1179 if (data._reconstruction_space_rank == 1) {
1180 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int k) {
1182 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions-1, data._poly_order,
false , &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k);
1183 for (
int m=0; m<data._sampling_multiplier; ++m) {
1184 int output_components = data._basis_multiplier;
1185 for (
int c=0; c<output_components; ++c) {
1186 int offset = data._d_ss.getTargetOffsetIndex(i, m , c , k);
1190 for (
int j=0; j<target_NP; ++j) {
1191 P_target_row(offset, c*target_NP + j) = delta(j);
1196 additional_evaluation_sites_handled =
true;
1198 }
else if (data._reconstruction_space_rank == 0) {
1199 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int k) {
1201 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions-1, data._poly_order,
false , &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k);
1202 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, k);
1203 for (
int j=0; j<target_NP; ++j) {
1204 P_target_row(offset, j) = delta(j);
1206 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, k);
1207 for (
int j=0; j<target_NP; ++j) {
1208 P_target_row(offset, j) = 0;
1212 offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, k);
1213 for (
int j=0; j<target_NP; ++j) {
1214 P_target_row(offset, j) = 0;
1216 offset = data._d_ss.getTargetOffsetIndex(i, 1, 1, k);
1217 for (
int j=0; j<target_NP; ++j) {
1218 P_target_row(offset, j) = delta(j);
1221 additional_evaluation_sites_handled =
true;
1226 }
else if (data._operations(i) == TargetOperation::LaplacianOfScalarPointEvaluation) {
1227 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1229 double h = data._epsilons(target_index);
1230 double a1=0, a2=0, a3=0, a4=0, a5=0;
1231 if (data._curvature_poly_order > 0) {
1232 a1 = curvature_coefficients(1);
1233 a2 = curvature_coefficients(2);
1235 if (data._curvature_poly_order > 1) {
1236 a3 = curvature_coefficients(3);
1237 a4 = curvature_coefficients(4);
1238 a5 = curvature_coefficients(5);
1240 double den = (h*h + a1*a1 + a2*a2);
1247 const int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1248 for (
int j=0; j<target_NP; ++j) {
1249 P_target_row(offset, j) = 0;
1252 if (data._poly_order > 0 && data._curvature_poly_order > 1) {
1253 P_target_row(offset, 1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5))/den/den/(h*h);
1254 P_target_row(offset, 2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5))/den/den/(h*h);
1256 if (data._poly_order > 1 && data._curvature_poly_order > 0) {
1257 P_target_row(offset, 3) = (h*h+a2*a2)/den/(h*h);
1258 P_target_row(offset, 4) = -2*a1*a2/den/(h*h);
1259 P_target_row(offset, 5) = (h*h+a1*a1)/den/(h*h);
1263 }
else if (data._operations(i) == TargetOperation::ChainedStaggeredLaplacianOfScalarPointEvaluation) {
1264 if (data._reconstruction_space == ReconstructionSpace::VectorTaylorPolynomial) {
1265 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1267 double h = data._epsilons(target_index);
1268 double a1=0, a2=0, a3=0, a4=0, a5=0;
1269 if (data._curvature_poly_order > 0) {
1270 a1 = curvature_coefficients(1);
1271 a2 = curvature_coefficients(2);
1273 if (data._curvature_poly_order > 1) {
1274 a3 = curvature_coefficients(3);
1275 a4 = curvature_coefficients(4);
1276 a5 = curvature_coefficients(5);
1278 double den = (h*h + a1*a1 + a2*a2);
1280 double c0a = -a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5)/den/den/h;
1281 double c1a = (h*h+a2*a2)/den/h;
1282 double c2a = -a1*a2/den/h;
1284 double c0b = -a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5)/den/den/h;
1285 double c1b = -a1*a2/den/h;
1286 double c2b = (h*h+a1*a1)/den/h;
1289 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1290 for (
int j=0; j<target_NP; ++j) {
1291 P_target_row(offset, j) = 0;
1292 P_target_row(offset, target_NP + j) = 0;
1294 P_target_row(offset, 0) = c0a;
1295 P_target_row(offset, 1) = c1a;
1296 P_target_row(offset, 2) = c2a;
1297 P_target_row(offset, target_NP + 0) = c0b;
1298 P_target_row(offset, target_NP + 1) = c1b;
1299 P_target_row(offset, target_NP + 2) = c2b;
1301 }
else if (data._reconstruction_space == ReconstructionSpace::ScalarTaylorPolynomial) {
1302 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1304 double h = data._epsilons(target_index);
1305 double a1=0, a2=0, a3=0, a4=0, a5=0;
1306 if (data._curvature_poly_order > 0) {
1307 a1 = curvature_coefficients(1);
1308 a2 = curvature_coefficients(2);
1310 if (data._curvature_poly_order > 1) {
1311 a3 = curvature_coefficients(3);
1312 a4 = curvature_coefficients(4);
1313 a5 = curvature_coefficients(5);
1315 double den = (h*h + a1*a1 + a2*a2);
1317 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1318 for (
int j=0; j<target_NP; ++j) {
1319 P_target_row(offset, j) = 0;
1323 if (data._poly_order > 0 && data._curvature_poly_order > 1) {
1324 P_target_row(offset, 1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5))/den/den/(h*h);
1325 P_target_row(offset, 2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5))/den/den/(h*h);
1327 if (data._poly_order > 1 && data._curvature_poly_order > 0) {
1328 P_target_row(offset, 3) = (h*h+a2*a2)/den/(h*h);
1329 P_target_row(offset, 4) = -2*a1*a2/den/(h*h);
1330 P_target_row(offset, 5) = (h*h+a1*a1)/den/(h*h);
1337 }
else if (data._operations(i) == TargetOperation::VectorLaplacianPointEvaluation) {
1339 if (data._reconstruction_space_rank == 1) {
1340 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1342 double h = data._epsilons(target_index);
1343 double a1=0, a2=0, a3=0, a4=0, a5=0;
1344 if (data._curvature_poly_order > 0) {
1345 a1 = curvature_coefficients(1);
1346 a2 = curvature_coefficients(2);
1348 if (data._curvature_poly_order > 1) {
1349 a3 = curvature_coefficients(3);
1350 a4 = curvature_coefficients(4);
1351 a5 = curvature_coefficients(5);
1353 double den = (h*h + a1*a1 + a2*a2);
1355 for (
int j=0; j<target_NP; ++j) {
1360 if (data._poly_order > 0 && data._curvature_poly_order > 1) {
1361 delta(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h);
1362 delta(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h);
1364 if (data._poly_order > 1 && data._curvature_poly_order > 0) {
1365 delta(3) = (h*h+a2*a2)/den/(h*h);
1366 delta(4) = -2*a1*a2/den/(h*h);
1367 delta(5) = (h*h+a1*a1)/den/(h*h);
1371 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1372 for (
int j=0; j<target_NP; ++j) {
1373 P_target_row(offset, j) = delta(j);
1374 P_target_row(offset, target_NP + j) = 0;
1376 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
1377 for (
int j=0; j<target_NP; ++j) {
1378 P_target_row(offset, j) = 0;
1379 P_target_row(offset, target_NP + j) = 0;
1383 offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, 0);
1384 for (
int j=0; j<target_NP; ++j) {
1385 P_target_row(offset, j) = 0;
1386 P_target_row(offset, target_NP + j) = 0;
1388 offset = data._d_ss.getTargetOffsetIndex(i, 1, 1, 0);
1389 for (
int j=0; j<target_NP; ++j) {
1390 P_target_row(offset, j) = 0;
1391 P_target_row(offset, target_NP + j) = delta(j);
1396 }
else if (data._reconstruction_space_rank == 0) {
1397 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1399 double h = data._epsilons(target_index);
1400 double a1=0, a2=0, a3=0, a4=0, a5=0;
1401 if (data._curvature_poly_order > 0) {
1402 a1 = curvature_coefficients(1);
1403 a2 = curvature_coefficients(2);
1405 if (data._curvature_poly_order > 1) {
1406 a3 = curvature_coefficients(3);
1407 a4 = curvature_coefficients(4);
1408 a5 = curvature_coefficients(5);
1410 double den = (h*h + a1*a1 + a2*a2);
1412 for (
int j=0; j<target_NP; ++j) {
1417 if (data._poly_order > 0 && data._curvature_poly_order > 1) {
1418 delta(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h);
1419 delta(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h);
1421 if (data._poly_order > 1 && data._curvature_poly_order > 0) {
1422 delta(3) = (h*h+a2*a2)/den/(h*h);
1423 delta(4) = -2*a1*a2/den/(h*h);
1424 delta(5) = (h*h+a1*a1)/den/(h*h);
1428 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1429 for (
int j=0; j<target_NP; ++j) {
1430 P_target_row(offset, j) = delta(j);
1432 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
1433 for (
int j=0; j<target_NP; ++j) {
1434 P_target_row(offset, j) = 0;
1438 offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, 0);
1439 for (
int j=0; j<target_NP; ++j) {
1440 P_target_row(offset, j) = 0;
1442 offset = data._d_ss.getTargetOffsetIndex(i, 1, 1, 0);
1443 for (
int j=0; j<target_NP; ++j) {
1444 P_target_row(offset, j) = delta(j);
1450 }
else if (data._operations(i) == TargetOperation::GradientOfScalarPointEvaluation) {
1451 if (data._reconstruction_space_rank == 0
1452 && (data._polynomial_sampling_functional == PointSample
1453 || data._polynomial_sampling_functional == ManifoldVectorPointSample)) {
1454 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1456 double h = data._epsilons(target_index);
1457 double a1 = curvature_coefficients(1);
1458 double a2 = curvature_coefficients(2);
1460 double q1 = (h*h + a2*a2)/(h*h*h + h*a1*a1 + h*a2*a2);
1461 double q2 = -(a1*a2)/(h*h*h + h*a1*a1 + h*a2*a2);
1462 double q3 = (h*h + a1*a1)/(h*h*h + h*a1*a1 + h*a2*a2);
1464 double t1a = q1*1 + q2*0;
1465 double t2a = q1*0 + q2*1;
1467 double t1b = q2*1 + q3*0;
1468 double t2b = q2*0 + q3*1;
1471 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1472 for (
int j=0; j<target_NP; ++j) {
1473 P_target_row(offset, j) = 0;
1475 if (data._poly_order > 0 && data._curvature_poly_order > 0) {
1476 P_target_row(offset, 1) = t1a + t2a;
1477 P_target_row(offset, 2) = 0;
1480 offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, 0);
1481 for (
int j=0; j<target_NP; ++j) {
1482 P_target_row(offset, j) = 0;
1484 if (data._poly_order > 0 && data._curvature_poly_order > 0) {
1485 P_target_row(offset, 1) = 0;
1486 P_target_row(offset, 2) = t1b + t2b;
1492 }
else if (data._reconstruction_space_rank == 1
1493 && data._polynomial_sampling_functional
1494 == StaggeredEdgeIntegralSample) {
1499 }
else if (data._reconstruction_space_rank == 0
1500 && data._polynomial_sampling_functional
1501 == StaggeredEdgeAnalyticGradientIntegralSample) {
1507 }
else if (data._operations(i) == TargetOperation::DivergenceOfVectorPointEvaluation) {
1509 if (data._reconstruction_space_rank == 1
1510 && data._polynomial_sampling_functional == ManifoldVectorPointSample) {
1511 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1513 double h = data._epsilons(target_index);
1514 double a1=0, a2=0, a3=0, a4=0, a5=0;
1515 if (data._curvature_poly_order > 0) {
1516 a1 = curvature_coefficients(1);
1517 a2 = curvature_coefficients(2);
1519 if (data._curvature_poly_order > 1) {
1520 a3 = curvature_coefficients(3);
1521 a4 = curvature_coefficients(4);
1522 a5 = curvature_coefficients(5);
1524 double den = (h*h + a1*a1 + a2*a2);
1528 double c0a = (a1*a3+a2*a4)/(h*den);
1532 double c0b = (a1*a4+a2*a5)/(h*den);
1537 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1538 for (
int j=0; j<target_NP; ++j) {
1539 P_target_row(offset, j) = 0;
1540 P_target_row(offset, target_NP + j) = 0;
1542 P_target_row(offset, 0) = c0a;
1543 P_target_row(offset, 1) = c1a;
1544 P_target_row(offset, 2) = c2a;
1547 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
1548 for (
int j=0; j<target_NP; ++j) {
1549 P_target_row(offset, j) = 0;
1550 P_target_row(offset, target_NP + j) = 0;
1552 P_target_row(offset, target_NP + 0) = c0b;
1553 P_target_row(offset, target_NP + 1) = c1b;
1554 P_target_row(offset, target_NP + 2) = c2b;
1557 }
else if (data._reconstruction_space_rank == 0
1558 && data._polynomial_sampling_functional == ManifoldVectorPointSample) {
1559 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1561 double h = data._epsilons(target_index);
1562 double a1=0, a2=0, a3=0, a4=0, a5=0;
1563 if (data._curvature_poly_order > 0) {
1564 a1 = curvature_coefficients(1);
1565 a2 = curvature_coefficients(2);
1567 if (data._curvature_poly_order > 1) {
1568 a3 = curvature_coefficients(3);
1569 a4 = curvature_coefficients(4);
1570 a5 = curvature_coefficients(5);
1572 double den = (h*h + a1*a1 + a2*a2);
1576 double c0a = (a1*a3+a2*a4)/(h*den);
1580 double c0b = (a1*a4+a2*a5)/(h*den);
1585 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1586 for (
int j=0; j<target_NP; ++j) {
1587 P_target_row(offset, j) = 0;
1589 P_target_row(offset, 0) = c0a;
1590 P_target_row(offset, 1) = c1a;
1591 P_target_row(offset, 2) = c2a;
1594 offset = data._d_ss.getTargetOffsetIndex(i, 1, 0, 0);
1595 for (
int j=0; j<target_NP; ++j) {
1596 P_target_row(offset, j) = 0;
1598 P_target_row(offset, 0) = c0b;
1599 P_target_row(offset, 1) = c1b;
1600 P_target_row(offset, 2) = c2b;
1603 }
else if (data._reconstruction_space_rank == 1
1604 && data._polynomial_sampling_functional
1605 == StaggeredEdgeIntegralSample) {
1607 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1609 double h = data._epsilons(target_index);
1610 double a1=0, a2=0, a3=0, a4=0, a5=0;
1611 if (data._curvature_poly_order > 0) {
1612 a1 = curvature_coefficients(1);
1613 a2 = curvature_coefficients(2);
1615 if (data._curvature_poly_order > 1) {
1616 a3 = curvature_coefficients(3);
1617 a4 = curvature_coefficients(4);
1618 a5 = curvature_coefficients(5);
1620 double den = (h*h + a1*a1 + a2*a2);
1624 double c0a = -a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5)/den/den/h;
1625 double c1a = (h*h+a2*a2)/den/h;
1626 double c2a = -a1*a2/den/h;
1628 double c0b = -a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4 + (h*h+a1*a1)*a5)/den/den/h;
1629 double c1b = -a1*a2/den/h;
1630 double c2b = (h*h+a1*a1)/den/h;
1633 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1634 for (
int j=0; j<target_NP; ++j) {
1635 P_target_row(offset, j) = 0;
1636 P_target_row(offset, target_NP + j) = 0;
1638 P_target_row(offset, 0) = c0a;
1639 P_target_row(offset, 1) = c1a;
1640 P_target_row(offset, 2) = c2a;
1641 P_target_row(offset, target_NP + 0) = c0b;
1642 P_target_row(offset, target_NP + 1) = c1b;
1643 P_target_row(offset, target_NP + 2) = c2b;
1649 }
else if (data._operations(i) == TargetOperation::GaussianCurvaturePointEvaluation) {
1650 double h = data._epsilons(target_index);
1652 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int k) {
1655 for (
int d=0; d<data._dimensions-1; ++d) {
1658 relative_coord[d] = data._additional_pc.getNeighborCoordinate(target_index, k-1, d, &V);
1659 relative_coord[d] -= data._pc.getTargetCoordinate(target_index, d, &V);
1662 for (
int j=0; j<3; ++j) relative_coord[j] = 0;
1665 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, k);
1666 P_target_row(offset, 0) =
GaussianCurvature(curvature_coefficients, h, relative_coord.x, relative_coord.y);
1668 additional_evaluation_sites_handled =
true;
1669 }
else if (data._operations(i) == TargetOperation::CurlOfVectorPointEvaluation) {
1670 double h = data._epsilons(target_index);
1672 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int k) {
1676 for (
int d=0; d<data._dimensions-1; ++d) {
1679 relative_coord[d] = data._additional_pc.getNeighborCoordinate(target_index, k-1, d, &V);
1680 relative_coord[d] -= data._pc.getTargetCoordinate(target_index, d, &V);
1683 for (
int j=0; j<3; ++j) relative_coord[j] = 0;
1686 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, k);
1688 for (
int n = 0; n <= data._poly_order; n++){
1689 for (alphay = 0; alphay <= n; alphay++){
1690 alphax = n - alphay;
1691 P_target_row(offset, index) =
SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 0);
1696 offset = data._d_ss.getTargetOffsetIndex(i, 0, 1, k);
1698 for (
int n = 0; n <= data._poly_order; n++){
1699 for (alphay = 0; alphay <= n; alphay++){
1700 alphax = n - alphay;
1701 P_target_row(offset, index) =
SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 1);
1706 additional_evaluation_sites_handled =
true;
1707 }
else if (data._operations(i) == TargetOperation::CellAverageEvaluation ||
1708 data._operations(i) == TargetOperation::CellIntegralEvaluation) {
1710 "CellAverageEvaluation and CellIntegralEvaluation only support 2d or 3d with 2d manifold");
1711 const double factorial[15] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200};
1712 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, 0);
1714 double cutoff_p = data._epsilons(target_index);
1721 double triangle_coords[3*3];
1722 for (
int j=0; j<data._global_dimensions*3; ++j) G_data[j] = 0;
1723 for (
int j=0; j<data._global_dimensions*3; ++j) triangle_coords[j] = 0;
1728 double radius = 0.0;
1729 for (
int j=0; j<data._global_dimensions; ++j) {
1731 triangle_coords_matrix(j, 0) = data._pc.getTargetCoordinate(target_index, j);
1732 radius += triangle_coords_matrix(j, 0)*triangle_coords_matrix(j, 0);
1734 radius = std::sqrt(radius);
1738 int num_vertices = 0;
1739 for (
int j=0; j<data._target_extra_data.extent_int(1); ++j) {
1740 auto val = data._target_extra_data(target_index, j);
1747 num_vertices = num_vertices / data._global_dimensions;
1748 auto T = triangle_coords_matrix;
1752 double entire_cell_area = 0.0;
1753 for (
int v=0; v<num_vertices; ++v) {
1755 int v2 = (v+1) % num_vertices;
1757 for (
int j=0; j<data._global_dimensions; ++j) {
1758 triangle_coords_matrix(j,1) = data._target_extra_data(target_index,
1759 v1*data._global_dimensions+j)
1760 - triangle_coords_matrix(j,0);
1761 triangle_coords_matrix(j,2) = data._target_extra_data(target_index,
1762 v2*data._global_dimensions+j)
1763 - triangle_coords_matrix(j,0);
1770 for (
int quadrature = 0; quadrature<data._qm.getNumberOfQuadraturePoints(); ++quadrature) {
1771 double unscaled_transformed_qp[3] = {0,0,0};
1772 double scaled_transformed_qp[3] = {0,0,0};
1773 for (
int j=0; j<data._global_dimensions; ++j) {
1774 for (
int k=1; k<3; ++k) {
1777 unscaled_transformed_qp[j] += T(j,k)*data._qm.getSite(quadrature, k-1);
1780 unscaled_transformed_qp[j] += T(j,0);
1784 double transformed_qp_norm = 0;
1785 for (
int j=0; j<data._global_dimensions; ++j) {
1786 transformed_qp_norm += unscaled_transformed_qp[j]*unscaled_transformed_qp[j];
1788 transformed_qp_norm = std::sqrt(transformed_qp_norm);
1791 for (
int j=0; j<data._global_dimensions; ++j) {
1792 scaled_transformed_qp[j] = unscaled_transformed_qp[j] * radius / transformed_qp_norm;
1812 double qp_norm_sq = transformed_qp_norm*transformed_qp_norm;
1813 for (
int j=0; j<data._global_dimensions; ++j) {
1814 G(j,1) = T(j,1)/transformed_qp_norm;
1815 G(j,2) = T(j,2)/transformed_qp_norm;
1816 for (
int k=0; k<data._global_dimensions; ++k) {
1817 G(j,1) += unscaled_transformed_qp[j]*(-0.5)*std::pow(qp_norm_sq,-1.5)
1818 *2*(unscaled_transformed_qp[k]*T(k,1));
1819 G(j,2) += unscaled_transformed_qp[j]*(-0.5)*std::pow(qp_norm_sq,-1.5)
1820 *2*(unscaled_transformed_qp[k]*T(k,2));
1824 Kokkos::subview(G, Kokkos::ALL(), 1), Kokkos::subview(G, Kokkos::ALL(), 2));
1825 G_determinant *= radius*radius;
1826 XYZ qp = XYZ(scaled_transformed_qp[0], scaled_transformed_qp[1], scaled_transformed_qp[2]);
1827 for (
int j=0; j<data._local_dimensions; ++j) {
1828 relative_coord[j] = data._pc.convertGlobalToLocalCoordinate(qp,j,V)
1829 - data._pc.getTargetCoordinate(target_index,j,&V);
1834 for (
int n = 0; n <= data._poly_order; n++){
1835 for (alphay = 0; alphay <= n; alphay++){
1836 alphax = n - alphay;
1837 alphaf = factorial[alphax]*factorial[alphay];
1838 double val_to_sum = G_determinant * (data._qm.getWeight(quadrature)
1839 * std::pow(relative_coord.x/cutoff_p,alphax)
1840 * std::pow(relative_coord.y/cutoff_p,alphay) / alphaf);
1841 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1842 if (quadrature==0 && v==0) P_target_row(offset, k) = val_to_sum;
1843 else P_target_row(offset, k) += val_to_sum;
1848 entire_cell_area += G_determinant * data._qm.getWeight(quadrature);
1851 if (data._operations(i) == TargetOperation::CellAverageEvaluation) {
1853 for (
int n = 0; n <= data._poly_order; n++){
1854 for (alphay = 0; alphay <= n; alphay++){
1855 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
1856 P_target_row(offset, k) /= entire_cell_area;
1862 }
else if (data._operations(i) == TargetOperation::FaceNormalAverageEvaluation ||
1863 data._operations(i) == TargetOperation::FaceNormalIntegralEvaluation ||
1864 data._operations(i) == TargetOperation::EdgeTangentAverageEvaluation ||
1865 data._operations(i) == TargetOperation::EdgeTangentIntegralEvaluation) {
1867 "FaceNormalIntegralSample, EdgeTangentIntegralSample, FaceNormalAverageSample, \
1868 and EdgeTangentAverageSample only support 2d or 3d with 2d manifold");
1870 &&
"Only 1d quadrature may be specified for edge integrals");
1872 &&
"Quadrature points not generated");
1874 const double factorial[15] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200};
1876 double cutoff_p = data._epsilons(target_index);
1887 int quadrature_point_loop = data._qm.getNumberOfQuadraturePoints();
1890 double G_data[3*TWO];
1891 double edge_coords[3*TWO];
1892 for (
int j=0; j<data._global_dimensions*TWO; ++j) G_data[j] = 0;
1893 for (
int j=0; j<data._global_dimensions*TWO; ++j) edge_coords[j] = 0;
1902 double radius = 0.0;
1904 for (
int j=0; j<data._global_dimensions; ++j) {
1905 edge_coords_matrix(j, 0) = data._target_extra_data(target_index, j);
1906 edge_coords_matrix(j, 1) = data._target_extra_data(target_index, data._global_dimensions + j) - edge_coords_matrix(j, 0);
1907 radius += edge_coords_matrix(j, 0)*edge_coords_matrix(j, 0);
1909 radius = std::sqrt(radius);
1913 auto E = edge_coords_matrix;
1917 if (data._problem_type == ProblemType::MANIFOLD) {
1918 XYZ a = {E(0,0), E(1,0), E(2,0)};
1919 XYZ b = {E(0,1)+E(0,0), E(1,1)+E(1,0), E(2,1)+E(2,0)};
1920 double a_dot_b = a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
1922 theta = std::atan(norm_a_cross_b / a_dot_b);
1925 for (
int c=0; c<data._local_dimensions; ++c) {
1926 int input_component = (data._sampling_multiplier==1 && data._reconstruction_space_rank==1) ? 0 : c;
1927 int offset = data._d_ss.getTargetOffsetIndex(i, input_component , 0 , 0);
1928 int column_offset = (data._reconstruction_space_rank==1) ? c*target_NP : 0;
1929 for (
int j=0; j<target_NP; ++j) {
1930 P_target_row(offset, column_offset + j) = 0;
1935 double entire_edge_length = 0.0;
1937 for (
int quadrature = 0; quadrature<quadrature_point_loop; ++quadrature) {
1939 double G_determinant = 1.0;
1940 double scaled_transformed_qp[3] = {0,0,0};
1941 double unscaled_transformed_qp[3] = {0,0,0};
1942 for (
int j=0; j<data._global_dimensions; ++j) {
1943 unscaled_transformed_qp[j] += E(j,1)*data._qm.getSite(quadrature, 0);
1945 unscaled_transformed_qp[j] += E(j,0);
1949 if (data._problem_type == ProblemType::MANIFOLD) {
1954 double transformed_qp_norm = 0;
1955 for (
int j=0; j<data._global_dimensions; ++j) {
1956 transformed_qp_norm += unscaled_transformed_qp[j]*unscaled_transformed_qp[j];
1958 transformed_qp_norm = std::sqrt(transformed_qp_norm);
1960 for (
int j=0; j<data._global_dimensions; ++j) {
1961 scaled_transformed_qp[j] = unscaled_transformed_qp[j] * radius / transformed_qp_norm;
1964 G_determinant = radius * theta;
1965 XYZ qp = XYZ(scaled_transformed_qp[0], scaled_transformed_qp[1], scaled_transformed_qp[2]);
1966 for (
int j=0; j<data._local_dimensions; ++j) {
1967 relative_coord[j] = data._pc.convertGlobalToLocalCoordinate(qp,j,V)
1968 - data._pc.getTargetCoordinate(target_index,j,&V);
1971 relative_coord[2] = 0;
1973 XYZ endpoints_difference = {E(0,1), E(1,1), 0};
1974 G_determinant = data._pc.EuclideanVectorLength(endpoints_difference, 2);
1975 for (
int j=0; j<data._local_dimensions; ++j) {
1976 relative_coord[j] = unscaled_transformed_qp[j]
1977 - data._pc.getTargetCoordinate(target_index,j,&V);
1980 relative_coord[2] = 0;
1985 if (data._operations(i) == TargetOperation::FaceNormalIntegralEvaluation
1986 || data._operations(i) == FaceNormalAverageEvaluation) {
1987 for (
int j=0; j<data._global_dimensions; ++j) {
1989 direction[j] = data._target_extra_data(target_index, 2*data._global_dimensions + j);
1992 if (data._problem_type == ProblemType::MANIFOLD) {
1994 XYZ k = {scaled_transformed_qp[0], scaled_transformed_qp[1], scaled_transformed_qp[2]};
1996 double k_norm = std::sqrt(k[0]*k[0]+k[1]*k[1]+k[2]*k[2]);
1997 k[0] = k[0]/k_norm; k[1] = k[1]/k_norm; k[2] = k[2]/k_norm;
1998 XYZ n = {data._target_extra_data(target_index, 2*data._global_dimensions + 0),
1999 data._target_extra_data(target_index, 2*data._global_dimensions + 1),
2000 data._target_extra_data(target_index, 2*data._global_dimensions + 2)};
2003 direction[0] = (k[1]*n[2] - k[2]*n[1]) / norm_k_cross_n;
2004 direction[1] = (k[2]*n[0] - k[0]*n[2]) / norm_k_cross_n;
2005 direction[2] = (k[0]*n[1] - k[1]*n[0]) / norm_k_cross_n;
2007 for (
int j=0; j<data._global_dimensions; ++j) {
2009 direction[j] = data._target_extra_data(target_index, 3*data._global_dimensions + j);
2015 XYZ local_direction;
2016 if (data._problem_type == ProblemType::MANIFOLD) {
2017 for (
int j=0; j<data._local_dimensions; ++j) {
2022 local_direction[j] = data._pc.convertGlobalToLocalCoordinate(direction,j,V);
2030 for (
int c=0; c<data._local_dimensions; ++c) {
2031 int input_component = (data._sampling_multiplier==1 && data._reconstruction_space_rank==1) ? 0 : c;
2032 int offset = data._d_ss.getTargetOffsetIndex(i, input_component, 0 , 0);
2033 int column_offset = (data._reconstruction_space_rank==1) ? c*target_NP : 0;
2035 for (
int n = 0; n <= data._poly_order; n++){
2036 for (alphay = 0; alphay <= n; alphay++){
2037 alphax = n - alphay;
2038 alphaf = factorial[alphax]*factorial[alphay];
2042 v0 = (c==0) ? std::pow(relative_coord.x/cutoff_p,alphax)
2043 *std::pow(relative_coord.y/cutoff_p,alphay)/alphaf : 0;
2044 v1 = (c==1) ? std::pow(relative_coord.x/cutoff_p,alphax)
2045 *std::pow(relative_coord.y/cutoff_p,alphay)/alphaf : 0;
2048 double dot_product = 0.0;
2049 if (data._problem_type == ProblemType::MANIFOLD) {
2051 dot_product = local_direction[0]*v0 + local_direction[1]*v1;
2053 dot_product = direction[0]*v0 + direction[1]*v1;
2057 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
2058 if (quadrature==0 && c==0) P_target_row(offset, column_offset + k) =
2059 dot_product * data._qm.getWeight(quadrature) * G_determinant;
2060 else P_target_row(offset, column_offset + k) +=
2061 dot_product * data._qm.getWeight(quadrature) * G_determinant;
2067 entire_edge_length += G_determinant * data._qm.getWeight(quadrature);
2069 if (data._operations(i) == TargetOperation::FaceNormalAverageEvaluation
2070 || data._operations(i) == TargetOperation::EdgeTangentAverageEvaluation) {
2071 for (
int c=0; c<data._local_dimensions; ++c) {
2076 int input_component = (data._sampling_multiplier==1 && data._reconstruction_space_rank==1) ? 0 : c;
2078 int offset = data._d_ss.getTargetOffsetIndex(i, input_component, 0 , 0);
2079 int column_offset = (data._reconstruction_space_rank == 1) ? c*target_NP : 0;
2080 for (
int n = 0; n <= data._poly_order; n++){
2081 for (alphay = 0; alphay <= n; alphay++){
2082 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
2083 P_target_row(offset, column_offset + k) /= entire_edge_length;
2093 }
else if (data._dimensions==2) {
2094 if (data._operations(i) == TargetOperation::ScalarPointEvaluation) {
2095 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [&] (
const int j) {
2096 calcPij<TargetData>(data, teamMember, delta.data(), thread_workspace.data(), target_index, -1 , 1 , data._dimensions-1, data._poly_order,
false , &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j);
2097 int offset = data._d_ss.getTargetOffsetIndex(i, 0, 0, j);
2098 for (
int k=0; k<target_NP; ++k) {
2099 P_target_row(offset, k) = delta(k);
2102 additional_evaluation_sites_handled =
true;
2109 (void)additional_evaluation_sites_handled;
2110 (void)additional_evaluation_sites_need_handled;
2111 compadre_kernel_assert_release(((additional_evaluation_sites_need_handled && additional_evaluation_sites_handled) || (!additional_evaluation_sites_need_handled)) &&
"Auxiliary evaluation coordinates are specified by user, but are calling a target operation that can not handle evaluating additional sites.");
2114 teamMember.team_barrier();