196 const int local_subdomain_id,
213 const ScalarT r_1 = radii( local_subdomain_id, r_cell - 1 );
214 const ScalarT r_2 = radii( local_subdomain_id, r_cell );
218 for (
int d = 0; d < 3; d++ )
220 vel_coeffs[d], local_subdomain_id, x_cell - 1, y_cell - 1, r_cell - 1, d, vel_grid );
225 ScalarT quad_weights_tri[num_quad_points_tri];
229 constexpr auto num_quad_points_line = 2;
230 ScalarT quad_points_line[num_quad_points_line] = { -1.0 / Kokkos::sqrt( 3 ), 1.0 / Kokkos::sqrt( 3 ) };
231 ScalarT quad_weights_line[num_quad_points_line] = { 1.0, 1.0 };
234 const Vec3 cell_center{
235 cell_centers( local_subdomain_id, x_cell, y_cell, r_cell, 0 ),
236 cell_centers( local_subdomain_id, x_cell, y_cell, r_cell, 1 ),
237 cell_centers( local_subdomain_id, x_cell, y_cell, r_cell, 2 ) };
242 beta[n] = ScalarT( 0 );
248 for (
int neighbor = 0; neighbor <
num_neighbors; ++neighbor )
258 for (
int q = 0; q < num_quad_points_tri; ++q )
260 const auto s = quad_points_tri[q]( 0 );
261 const auto t = quad_points_tri[q]( 1 );
263 ScalarT xi = 0, eta = 0, zeta = 0;
265 map_face( neighbor, wedge, s, t, xi, eta, zeta, cpt );
267 Vec3 dx_dxi{}, dx_deta{}, dx_dzeta{}, u{};
272 const Vec3 x_i = wedge_phy_surf[wedge][i % 3] * ( i < 3 ? r_1 : r_2 );
274 vel_coeffs[0][wedge]( i ), vel_coeffs[1][wedge]( i ), vel_coeffs[2][wedge]( i ) };
275 dx_dxi = dx_dxi + grad_i( 0 ) * x_i;
276 dx_deta = dx_deta + grad_i( 1 ) * x_i;
277 dx_dzeta = dx_dzeta + grad_i( 2 ) * x_i;
278 u = u + shape_i * u_i;
282 beta[neighbor] += quad_weights_tri[q] * u.
dot( n );
283 S_f[neighbor] = S_f[neighbor] + quad_weights_tri[q] * n;
288 for (
int q_a = 0; q_a < num_quad_points_line; ++q_a )
290 for (
int q_b = 0; q_b < num_quad_points_line; ++q_b )
303 const auto s = ScalarT( 0.5 ) * ( quad_points_line[q_a] + ScalarT( 1 ) );
304 const auto t = quad_points_line[q_b];
305 const auto w = ScalarT( 0.5 ) * quad_weights_line[q_a] * quad_weights_line[q_b];
307 ScalarT xi = 0, eta = 0, zeta = 0;
309 map_face( neighbor, wedge, s, t, xi, eta, zeta, cpt );
311 Vec3 dx_dxi{}, dx_deta{}, dx_dzeta{}, u{};
316 const Vec3 x_i = wedge_phy_surf[wedge][i % 3] * ( i < 3 ? r_1 : r_2 );
318 vel_coeffs[0][wedge]( i ), vel_coeffs[1][wedge]( i ), vel_coeffs[2][wedge]( i ) };
319 dx_dxi = dx_dxi + grad_i( 0 ) * x_i;
320 dx_deta = dx_deta + grad_i( 1 ) * x_i;
321 dx_dzeta = dx_dzeta + grad_i( 2 ) * x_i;
322 u = u + shape_i * u_i;
327 n = dx_dxi.
cross( dx_dzeta );
329 n = dx_deta.
cross( dx_dzeta );
331 beta[neighbor] += w * u.
dot( n );
332 S_f[neighbor] = S_f[neighbor] + w * n;
344 const Vec3 neighbor_center{
345 cell_centers( local_subdomain_id, nx, ny, nr, 0 ),
346 cell_centers( local_subdomain_id, nx, ny, nr, 1 ),
347 cell_centers( local_subdomain_id, nx, ny, nr, 2 ) };
349 if ( S_f[neighbor].dot( neighbor_center - cell_center ) < 0 )
351 S_f[neighbor] = S_f[neighbor] * ScalarT( -1 );
352 beta[neighbor] *= ScalarT( -1 );
359 ScalarT quad_weights_vol[num_quad_points_vol];
364 for (
int q = 0; q < num_quad_points_vol; ++q )
366 const auto J =
fe::wedge::jac( wedge_phy_surf[wedge], r_1, r_2, quad_points_vol[q] );
367 const auto abs_det = Kokkos::abs( J.det() );
368 M_ii += abs_det * quad_weights_vol[q];