194 const int target_index =
_data._initial_index_for_batch + teamMember.league_rank();
195 const int local_index = teamMember.league_rank();
196 const int dimensions =
_data._dimensions;
205 _data.thread_workspace_dim);
211 dimensions-1, dimensions);
213 _data.max_num_neighbors);
215 _data.max_num_neighbors);
216 for (
int j = 0; j < delta.extent_int(0); ++j) {
219 for (
int j = 0; j < thread_workspace.extent_int(0); ++j) {
220 thread_workspace(j) = 0;
232 dimensions, dimensions);
235 _data.manifold_gradient_dim);
242 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
243 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
244 _data._prestencil_weights(0,0,0,0,0) = -1;
245 _data._prestencil_weights(1,0,0,0,0) = 1;
249 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
250 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
251 for (
int j=0; j<dimensions; ++j) {
252 for (
int k=0; k<dimensions-1; ++k) {
253 _data._prestencil_weights(0,target_index,0,k,j) = T(k,j);
260 &&
"StaggeredEdgeIntegralSample prestencil weight only written for manifolds.");
261 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
262 _data._pc._nla.getNumberOfNeighborsDevice(target_index)), [&] (
const int m) {
263 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
264 for (int quadrature = 0; quadrature<_data._qm.getNumberOfQuadraturePoints(); ++quadrature) {
265 XYZ tangent_quadrature_coord_2d;
266 for (int j=0; j<dimensions-1; ++j) {
267 tangent_quadrature_coord_2d[j] = _data._pc.getTargetCoordinate(target_index, j, &T);
268 tangent_quadrature_coord_2d[j] -= _data._pc.getNeighborCoordinate(target_index, m, j, &T);
270 double tangent_vector[3];
271 tangent_vector[0] = tangent_quadrature_coord_2d[0]*T(0,0) + tangent_quadrature_coord_2d[1]*T(1,0);
272 tangent_vector[1] = tangent_quadrature_coord_2d[0]*T(0,1) + tangent_quadrature_coord_2d[1]*T(1,1);
273 tangent_vector[2] = tangent_quadrature_coord_2d[0]*T(0,2) + tangent_quadrature_coord_2d[1]*T(1,2);
275 for (int j=0; j<dimensions; ++j) {
276 _data._prestencil_weights(0,target_index,m,0,j) += (1-_data._qm.getSite(quadrature,0))*tangent_vector[j]*_data._qm.getWeight(quadrature);
277 _data._prestencil_weights(1,target_index,m,0,j) += _data._qm.getSite(quadrature,0)*tangent_vector[j]*_data._qm.getWeight(quadrature);
284 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
287 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
288 calcGradientPij(_data, teamMember, delta.data(), thread_workspace.data(), target_index,
289 m, 0 , 0 , dimensions-1, _data._curvature_poly_order,
290 false , &T, ReconstructionSpace::ScalarTaylorPolynomial,
294 double grad_xi1 = 0, grad_xi2 = 0;
295 Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(teamMember,
298 for (int l=0; l<_data.manifold_NP; ++l) {
299 alpha_ij += delta(l)*Q(l,i);
302 double normal_coordinate = rel_coord[dimensions-1];
305 t_grad_xi1 += alpha_ij * normal_coordinate;
309 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
315 Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(teamMember,
316 _data._pc._nla.getNumberOfNeighborsDevice(target_index)), [&] (
const int i,
double &t_grad_xi2) {
318 for (int l=0; l<_data.manifold_NP; ++l) {
319 alpha_ij += delta(l)*Q(l,i);
321 XYZ rel_coord =
_data._pc.getRelativeCoord(target_index, i, dimensions, &T);
322 double normal_coordinate = rel_coord[dimensions-1];
325 if (dimensions>2) t_grad_xi2 += alpha_ij * normal_coordinate;
330 teamMember.team_barrier();
332 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
335 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
336 for (int j=0; j<dimensions; ++j) {
337 tangent(0,j) = t1(m)*T(dimensions-1,j) + T(0,j);
338 tangent(1,j) = t2(m)*T(dimensions-1,j) + T(1,j);
343 for (int j=0; j<dimensions; ++j) {
344 norm += tangent(0,j)*tangent(0,j);
348 norm = std::sqrt(norm);
349 for (int j=0; j<dimensions; ++j) {
350 tangent(0,j) /= norm;
354 if (dimensions-1 == 2) {
355 double dot_product = tangent(0,0)*tangent(1,0)
356 + tangent(0,1)*tangent(1,1)
357 + tangent(0,2)*tangent(1,2);
358 for (int j=0; j<dimensions; ++j) {
359 tangent(1,j) -= dot_product*tangent(0,j);
363 for (int j=0; j<dimensions; ++j) {
364 norm += tangent(1,j)*tangent(1,j);
366 norm = std::sqrt(norm);
367 for (int j=0; j<dimensions; ++j) {
368 tangent(1,j) /= norm;
373 for (int j=0; j<dimensions; ++j) {
374 for (int k=0; k<dimensions-1; ++k) {
375 _data._prestencil_weights(0,target_index,m,k,j) = tangent(k,j);
381 teamMember.team_barrier();