186 const int target_index =
_data._initial_index_for_batch + teamMember.league_rank();
187 const int local_index = teamMember.league_rank();
188 const int dimensions =
_data._dimensions;
197 _data.thread_workspace_dim);
203 dimensions-1, dimensions);
205 _data.max_num_neighbors);
207 _data.max_num_neighbors);
208 for (
int j = 0; j < delta.extent_int(0); ++j) {
211 for (
int j = 0; j < thread_workspace.extent_int(0); ++j) {
212 thread_workspace(j) = 0;
224 dimensions, dimensions);
227 _data.manifold_gradient_dim);
234 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
235 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
236 _data._prestencil_weights(0,0,0,0,0) = -1;
237 _data._prestencil_weights(1,0,0,0,0) = 1;
241 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
242 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
243 for (
int j=0; j<dimensions; ++j) {
244 for (
int k=0; k<dimensions-1; ++k) {
245 _data._prestencil_weights(0,target_index,0,k,j) = T(k,j);
252 &&
"StaggeredEdgeIntegralSample prestencil weight only written for manifolds.");
253 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
254 _data._pc._nla.getNumberOfNeighborsDevice(target_index)), [&] (
const int m) {
255 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
256 for (int quadrature = 0; quadrature<_data._qm.getNumberOfQuadraturePoints(); ++quadrature) {
257 XYZ tangent_quadrature_coord_2d;
258 for (int j=0; j<dimensions-1; ++j) {
259 tangent_quadrature_coord_2d[j] = _data._pc.getTargetCoordinate(target_index, j, &T);
260 tangent_quadrature_coord_2d[j] -= _data._pc.getNeighborCoordinate(target_index, m, j, &T);
262 double tangent_vector[3];
263 tangent_vector[0] = tangent_quadrature_coord_2d[0]*T(0,0) + tangent_quadrature_coord_2d[1]*T(1,0);
264 tangent_vector[1] = tangent_quadrature_coord_2d[0]*T(0,1) + tangent_quadrature_coord_2d[1]*T(1,1);
265 tangent_vector[2] = tangent_quadrature_coord_2d[0]*T(0,2) + tangent_quadrature_coord_2d[1]*T(1,2);
267 for (int j=0; j<dimensions; ++j) {
268 _data._prestencil_weights(0,target_index,m,0,j) += (1-_data._qm.getSite(quadrature,0))*tangent_vector[j]*_data._qm.getWeight(quadrature);
269 _data._prestencil_weights(1,target_index,m,0,j) += _data._qm.getSite(quadrature,0)*tangent_vector[j]*_data._qm.getWeight(quadrature);
276 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
279 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
280 calcGradientPij(_data, teamMember, delta.data(), thread_workspace.data(), target_index,
281 m, 0 , 0 , dimensions-1, _data._curvature_poly_order,
282 false , &T, ReconstructionSpace::ScalarTaylorPolynomial,
286 double grad_xi1 = 0, grad_xi2 = 0;
287 Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(teamMember,
290 for (int l=0; l<_data.manifold_NP; ++l) {
291 alpha_ij += delta(l)*Q(l,i);
294 double normal_coordinate = rel_coord[dimensions-1];
297 t_grad_xi1 += alpha_ij * normal_coordinate;
301 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
307 Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(teamMember,
308 _data._pc._nla.getNumberOfNeighborsDevice(target_index)), [&] (
const int i,
double &t_grad_xi2) {
310 for (int l=0; l<_data.manifold_NP; ++l) {
311 alpha_ij += delta(l)*Q(l,i);
313 XYZ rel_coord =
_data._pc.getRelativeCoord(target_index, i, dimensions, &T);
314 double normal_coordinate = rel_coord[dimensions-1];
317 if (dimensions>2) t_grad_xi2 += alpha_ij * normal_coordinate;
322 teamMember.team_barrier();
324 Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,
327 Kokkos::single(Kokkos::PerThread(teamMember), [&] () {
328 for (int j=0; j<dimensions; ++j) {
329 tangent(0,j) = t1(m)*T(dimensions-1,j) + T(0,j);
330 tangent(1,j) = t2(m)*T(dimensions-1,j) + T(1,j);
335 for (int j=0; j<dimensions; ++j) {
336 norm += tangent(0,j)*tangent(0,j);
340 norm = std::sqrt(norm);
341 for (int j=0; j<dimensions; ++j) {
342 tangent(0,j) /= norm;
346 if (dimensions-1 == 2) {
347 double dot_product = tangent(0,0)*tangent(1,0)
348 + tangent(0,1)*tangent(1,1)
349 + tangent(0,2)*tangent(1,2);
350 for (int j=0; j<dimensions; ++j) {
351 tangent(1,j) -= dot_product*tangent(0,j);
355 for (int j=0; j<dimensions; ++j) {
356 norm += tangent(1,j)*tangent(1,j);
358 norm = std::sqrt(norm);
359 for (int j=0; j<dimensions; ++j) {
360 tangent(1,j) /= norm;
365 for (int j=0; j<dimensions; ++j) {
366 for (int k=0; k<dimensions-1; ++k) {
367 _data._prestencil_weights(0,target_index,m,k,j) = tangent(k,j);
373 teamMember.team_barrier();