3#include "../../quadrature/quadrature.hpp"
16template <
typename ScalarT,
int VecDim = 3 >
58 , treat_boundary_( treat_boundary )
59 , diagonal_( diagonal )
60 , operator_apply_mode_( operator_apply_mode )
61 , operator_communication_mode_( operator_communication_mode )
63 , send_buffers_( domain )
64 , recv_buffers_( domain )
73 operator_apply_mode_ = operator_apply_mode;
74 operator_communication_mode_ = operator_communication_mode;
89 if ( src_.extent( 0 ) != dst_.extent( 0 ) || src_.extent( 1 ) != dst_.extent( 1 ) ||
90 src_.extent( 2 ) != dst_.extent( 2 ) || src_.extent( 3 ) != dst_.extent( 3 ) )
92 throw std::runtime_error(
"VectorLaplace: src/dst mismatch" );
95 if ( src_.extent( 1 ) != grid_.extent( 1 ) || src_.extent( 2 ) != grid_.extent( 2 ) )
97 throw std::runtime_error(
"VectorLaplace: src/dst mismatch" );
100 util::Timer timer_kernel(
"vector_laplace_kernel" );
110 domain_, dst_, send_buffers_, recv_buffers_ );
115 KOKKOS_INLINE_FUNCTION
void
116 operator()(
const int local_subdomain_id,
const int x_cell,
const int y_cell,
const int r_cell )
const
123 const ScalarT r_1 = radii_( local_subdomain_id, r_cell );
124 const ScalarT r_2 = radii_( local_subdomain_id, r_cell + 1 );
130 ScalarT quad_weights[num_quad_points];
142 for (
int dimi = 0; dimi < 3; ++dimi )
144 for (
int dimj = 0; dimj < 3; ++dimj )
146 if ( diagonal_ and dimi != dimj )
150 for (
int q = 0; q < num_quad_points; q++ )
152 const auto w = quad_weights[q];
157 const auto det = J.det();
158 const auto abs_det = Kokkos::abs( det );
159 const auto J_inv_transposed = J.inv_transposed( det );
163 k_eval +=
shape( j, quad_points[q] ) * k[wedge]( j );
186 0.5 * w * k_eval * ( ( sym_grad_i ).double_contract( sym_grad_j ) * abs_det );
194 if ( treat_boundary_ )
196 for (
int dimi = 0; dimi < 3; ++dimi )
198 for (
int dimj = 0; dimj < 3; ++dimj )
203 boundary_mask.
fill( 1.0 );
208 for (
int i = 0; i < 6; i++ )
210 for (
int j = 0; j < 6; j++ )
212 if ( ( dimi == dimj && i != j && ( i < 3 || j < 3 ) ) or
213 ( dimi != dimj && ( i < 3 || j < 3 ) ) )
222 if ( r_cell + 1 == radii_.extent( 1 ) - 1 )
225 for (
int i = 0; i < 6; i++ )
227 for (
int j = 0; j < 6; j++ )
229 if ( ( dimi == dimj && i != j && ( i >= 3 || j >= 3 ) ) or
230 ( dimi != dimj && ( i >= 3 || j >= 3 ) ) )
252 for (
int dimj = 0; dimj < 3; dimj++ )
269 dst[0] = A[0] * src[0];
270 dst[1] = A[1] * src[1];
273 for (
int dimi = 0; dimi < 3; dimi++ )
280 dst_, local_subdomain_id, x_cell, y_cell, r_cell, dimi, dst_d );
Send and receive buffers for all process-local subdomain boundaries.
Definition communication.hpp:56
Definition epsilon_simple.hpp:18
void set_operator_apply_and_communication_modes(const linalg::OperatorApplyMode operator_apply_mode, const linalg::OperatorCommunicationMode operator_communication_mode)
Definition epsilon_simple.hpp:69
void apply_impl(const SrcVectorType &src, DstVectorType &dst)
Definition epsilon_simple.hpp:77
ScalarT ScalarType
Definition epsilon_simple.hpp:22
const grid::Grid4DDataScalar< ScalarType > & k_grid_data()
Definition epsilon_simple.hpp:67
EpsilonSimple(const grid::shell::DistributedDomain &domain, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const grid::Grid4DDataScalar< ScalarT > &k, bool treat_boundary, bool diagonal, linalg::OperatorApplyMode operator_apply_mode=linalg::OperatorApplyMode::Replace, linalg::OperatorCommunicationMode operator_communication_mode=linalg::OperatorCommunicationMode::CommunicateAdditively)
Definition epsilon_simple.hpp:44
void operator()(const int local_subdomain_id, const int x_cell, const int y_cell, const int r_cell) const
Definition epsilon_simple.hpp:116
Parallel data structure organizing the thick spherical shell metadata for distributed (MPI parallel) ...
Definition spherical_shell.hpp:2498
Static assertion: VectorQ1Scalar satisfies VectorLike concept.
Definition vector_q1.hpp:162
const grid::Grid4DDataVec< ScalarType, VecDim > & grid_data() const
Get const reference to grid data.
Definition vector_q1.hpp:280
Timer supporting RAII scope or manual stop.
Definition timer.hpp:270
void stop()
Stop the timer and record elapsed time.
Definition timer.hpp:289
Concept for types that behave like linear operators.
Definition operator.hpp:57
void unpack_and_reduce_local_subdomain_boundaries(const grid::shell::DistributedDomain &domain, const GridDataType &data, SubdomainNeighborhoodSendRecvBuffer< typename GridDataType::value_type, grid::grid_data_vec_dim< GridDataType >() > &boundary_recv_buffers, CommunicationReduction reduction=CommunicationReduction::SUM)
Unpacks and reduces local subdomain boundaries.
Definition communication.hpp:672
void pack_send_and_recv_local_subdomain_boundaries(const grid::shell::DistributedDomain &domain, const GridDataType &data, SubdomainNeighborhoodSendRecvBuffer< typename GridDataType::value_type, grid::grid_data_vec_dim< GridDataType >() > &boundary_send_buffers, SubdomainNeighborhoodSendRecvBuffer< typename GridDataType::value_type, grid::grid_data_vec_dim< GridDataType >() > &boundary_recv_buffers)
Packs, sends and recvs local subdomain boundaries using two sets of buffers.
Definition communication.hpp:242
Definition boundary_mass.hpp:14
constexpr void quad_felippa_3x2_quad_weights(T(&quad_weights)[quad_felippa_3x2_num_quad_points])
Definition wedge/quadrature/quadrature.hpp:93
constexpr int quad_felippa_3x2_num_quad_points
Definition wedge/quadrature/quadrature.hpp:66
constexpr void quad_felippa_3x2_quad_points(dense::Vec< T, 3 >(&quad_points)[quad_felippa_3x2_num_quad_points])
Definition wedge/quadrature/quadrature.hpp:70
constexpr int num_nodes_per_wedge_surface
Definition kernel_helpers.hpp:6
void wedge_surface_physical_coords(dense::Vec< T, 3 >(&wedge_surf_phy_coords)[num_wedges_per_hex_cell][num_nodes_per_wedge_surface], const grid::Grid3DDataVec< T, 3 > &lateral_grid, const int local_subdomain_id, const int x_cell, const int y_cell)
Extracts the (unit sphere) surface vertex coords of the two wedges of a hex cell.
Definition kernel_helpers.hpp:26
void atomically_add_local_wedge_vector_coefficients(const grid::Grid4DDataVec< T, VecDim > &global_coefficients, const int local_subdomain_id, const int x_cell, const int y_cell, const int r_cell, const int d, const dense::Vec< T, 6 > local_coefficients[2])
Performs an atomic add of the two local wedge coefficient vectors of a hex cell into the global coeff...
Definition kernel_helpers.hpp:465
constexpr int num_wedges_per_hex_cell
Definition kernel_helpers.hpp:5
void extract_local_wedge_scalar_coefficients(dense::Vec< T, 6 >(&local_coefficients)[2], const int local_subdomain_id, const int x_cell, const int y_cell, const int r_cell, const grid::Grid4DDataScalar< T > &global_coefficients)
Extracts the local vector coefficients for the two wedges of a hex cell from the global coefficient v...
Definition kernel_helpers.hpp:306
void extract_local_wedge_vector_coefficients(dense::Vec< T, 6 >(&local_coefficients)[2], const int local_subdomain_id, const int x_cell, const int y_cell, const int r_cell, const int d, const grid::Grid4DDataVec< T, VecDim > &global_coefficients)
Extracts the local vector coefficients for the two wedges of a hex cell from the global coefficient v...
Definition kernel_helpers.hpp:356
constexpr int num_nodes_per_wedge
Definition kernel_helpers.hpp:7
constexpr dense::Vec< T, 3 > grad_shape(const int node_idx, const T xi, const T eta, const T zeta)
Gradient of the full shape function:
Definition integrands.hpp:228
constexpr T shape(const int node_idx, const T xi, const T eta, const T zeta)
(Tensor-product) Shape function.
Definition integrands.hpp:146
constexpr dense::Mat< T, 3, 3 > jac(const dense::Vec< T, 3 > &p1_phy, const dense::Vec< T, 3 > &p2_phy, const dense::Vec< T, 3 > &p3_phy, const T r_1, const T r_2, const T xi, const T eta, const T zeta)
Definition integrands.hpp:643
Kokkos::MDRangePolicy< Kokkos::Rank< 4 > > local_domain_md_range_policy_cells(const DistributedDomain &distributed_domain)
Definition spherical_shell.hpp:2668
Kokkos::View< ScalarType ***[VecDim], Layout > Grid3DDataVec
Definition grid_types.hpp:40
Kokkos::View< ScalarType ****[VecDim], Layout > Grid4DDataVec
Definition grid_types.hpp:43
Kokkos::View< ScalarType ****, Layout > Grid4DDataScalar
Definition grid_types.hpp:25
Kokkos::View< ScalarType **, Layout > Grid2DDataScalar
Definition grid_types.hpp:19
OperatorApplyMode
Modes for applying an operator to a vector.
Definition operator.hpp:30
@ Replace
Overwrite the destination vector.
OperatorCommunicationMode
Modes for communication during operator application.
Definition operator.hpp:40
@ CommunicateAdditively
Communicate and add results.
void fill(const T value)
Definition mat.hpp:201
constexpr Mat diagonal() const
Definition mat.hpp:377
constexpr Mat< T, Cols, Rows > transposed() const
Definition mat.hpp:187
static constexpr Mat from_single_col_vec(const Vec< T, Cols > &col, const int d)
Definition mat.hpp:66
Mat & hadamard_product(const Mat &mat)
Definition mat.hpp:213