Loading...
Searching...
No Matches
vector_q1.hpp
Go to the documentation of this file.
1#pragma once
2#include <mpi.h>
3
9#include "vector.hpp"
10
11namespace terra::linalg {
12
13/// @brief Q1 scalar finite element vector on a distributed shell grid.
14///
15/// Same layout as required for tensor-product wedge elements.
16///
17/// Satisfies the VectorLike concept (see vector.hpp).
18/// Provides masked grid data and operations for scalar fields.
19template < typename ScalarT >
21{
22 public:
23 /// @brief Scalar type of the vector.
24 using ScalarType = ScalarT;
25
26 /// @brief Default constructor.
27 VectorQ1Scalar() = default;
28
29 /// @brief Construct a Q1 scalar vector with label, domain, and mask data.
30 /// @param label Name for the vector.
31 /// @param distributed_domain Distributed shell domain.
32 /// @param mask_data Mask data grid.
34 const std::string& label,
35 const grid::shell::DistributedDomain& distributed_domain,
37 : mask_data_( mask_data )
38 {
40 label,
41 distributed_domain.subdomains().size(),
44 distributed_domain.domain_info().subdomain_num_nodes_radially() );
45
46 grid_data_ = grid_data;
47
48 if ( mask_data_.extent( 0 ) != grid_data_.extent( 0 ) || mask_data_.extent( 1 ) != grid_data_.extent( 1 ) ||
49 mask_data_.extent( 2 ) != grid_data_.extent( 2 ) || mask_data_.extent( 3 ) != grid_data_.extent( 3 ) )
50 {
51 throw std::runtime_error(
52 "VectorQ1Scalar::VectorQ1Scalar: mask_data and grid_data must have the same size" );
53 }
54 }
55
56 /// @brief Linear combination implementation for VectorLike concept.
57 /// Computes: \f$ y = c_0 + \sum_i c_i x_i \f$
58 /// @param c Coefficients.
59 /// @param x Input vectors.
60 /// @param c0 Scalar to add.
61 void lincomb_impl( const std::vector< ScalarType >& c, const std::vector< VectorQ1Scalar >& x, const ScalarType c0 )
62 {
63 if ( c.size() != x.size() )
64 {
65 throw std::runtime_error( "VectorQ1Scalar::lincomb: c and x must have the same size" );
66 }
67
68 if ( x.size() == 0 )
69 {
70 kernels::common::set_constant( grid_data_, c0 );
71 }
72 else if ( x.size() == 1 )
73 {
74 kernels::common::lincomb( grid_data_, c0, c[0], x[0].grid_data() );
75 }
76 else if ( x.size() == 2 )
77 {
78 kernels::common::lincomb( grid_data_, c0, c[0], x[0].grid_data(), c[1], x[1].grid_data() );
79 }
80 else if ( x.size() == 3 )
81 {
83 grid_data_, c0, c[0], x[0].grid_data(), c[1], x[1].grid_data(), c[2], x[2].grid_data() );
84 }
85 else
86 {
87 throw std::runtime_error( "VectorQ1Scalar::lincomb: not implemented" );
88 }
89 }
90
91 /// @brief Dot product implementation for VectorLike concept.
92 /// Computes: \f$ \sum_{i} y_i \cdot x_i \f$ over owned nodes.
93 /// @param x Other vector.
94 /// @return Dot product value.
100
101 /// @brief Invert entries implementation for VectorLike concept.
102 /// Computes: \f$ y_i = 1 / y_i \f$
104
105 /// @brief Elementwise scaling implementation for VectorLike concept.
106 /// Computes: \f$ y_i = y_i \cdot x_i \f$
107 /// @param x Scaling vector.
112
113 /// @brief Randomize entries implementation for VectorLike concept.
114 /// Sets each entry of grid_data to a random value.
115 void randomize_impl() { return kernels::common::rand( grid_data_ ); }
116
117 /// @brief Max absolute entry implementation for VectorLike concept.
118 /// Computes: \f$ \max_i |y_i| \f$
119 /// @return Maximum absolute value.
121
122 /// @brief NaN/inf check implementation for VectorLike concept.
123 /// Returns true if any entry of grid_data is NaN/inf.
124 /// @return True if NaN/inf is present.
125 bool has_nan_or_inf_impl() const { return kernels::common::has_nan_or_inf( grid_data_ ); }
126
127 /// @brief Swap implementation for VectorLike concept.
128 /// Exchanges grid_data and mask_data with another vector.
129 /// @param other Other vector.
131 {
132 std::swap( grid_data_, other.grid_data_ );
133 std::swap( mask_data_, other.mask_data_ );
134 }
135
136 /// @brief Get const reference to grid data.
137 const grid::Grid4DDataScalar< ScalarType >& grid_data() const { return grid_data_; }
138 /// @brief Get mutable reference to grid data.
140
141 /// @brief Get const reference to mask data.
143 /// @brief Get mutable reference to mask data.
145
146 private:
149};
150
151/// @brief Static assertion: VectorQ1Scalar satisfies VectorLike concept.
152static_assert( VectorLike< VectorQ1Scalar< double > > );
153
154/// @brief Q1 vector finite element vector on a distributed shell grid.
155///
156/// Same layout as required for tensor-product wedge elements.
157///
158/// Satisfies the VectorLike concept (see vector.hpp).
159/// Provides masked grid data and operations for vector fields.
160template < typename ScalarT, int VecDim = 3 >
162{
163 public:
164 /// @brief Default constructor.
165 VectorQ1Vec() = default;
166
167 /// @brief Construct a Q1 vector with label, domain, and mask data.
168 /// @param label Name for the vector.
169 /// @param distributed_domain Distributed shell domain.
170 /// @param mask_data Mask data grid.
172 const std::string& label,
173 const grid::shell::DistributedDomain& distributed_domain,
175 : mask_data_( mask_data )
176 {
178 label,
179 distributed_domain.subdomains().size(),
182 distributed_domain.domain_info().subdomain_num_nodes_radially() );
183
184 grid_data_ = grid_data;
185
186 if ( mask_data_.extent( 0 ) != grid_data_.extent( 0 ) || mask_data_.extent( 1 ) != grid_data_.extent( 1 ) ||
187 mask_data_.extent( 2 ) != grid_data_.extent( 2 ) || mask_data_.extent( 3 ) != grid_data_.extent( 3 ) )
188 {
189 throw std::runtime_error(
190 "VectorQ1Scalar::VectorQ1Scalar: mask_data and grid_data must have the same size" );
191 }
192 }
193
194 /// @brief Scalar type of the vector.
195 using ScalarType = ScalarT;
196 /// @brief Dimension of the vector field.
197 const static int Dim = VecDim;
198
199 /// @brief Linear combination implementation for VectorLike concept.
200 /// Computes: \f$ y = c_0 + \sum_i c_i x_i \f$
201 /// @param c Coefficients.
202 /// @param x Input vectors.
203 /// @param c0 Scalar to add.
204 void lincomb_impl( const std::vector< ScalarType >& c, const std::vector< VectorQ1Vec >& x, const ScalarType c0 )
205 {
206 if ( c.size() != x.size() )
207 {
208 throw std::runtime_error( "VectorQ1Scalar::lincomb: c and x must have the same size" );
209 }
210
211 if ( x.size() == 0 )
212 {
213 kernels::common::set_constant( grid_data_, c0 );
214 }
215 else if ( x.size() == 1 )
216 {
217 kernels::common::lincomb( grid_data_, c0, c[0], x[0].grid_data() );
218 }
219 else if ( x.size() == 2 )
220 {
221 kernels::common::lincomb( grid_data_, c0, c[0], x[0].grid_data(), c[1], x[1].grid_data() );
222 }
223 else if ( x.size() == 3 )
224 {
226 grid_data_, c0, c[0], x[0].grid_data(), c[1], x[1].grid_data(), c[2], x[2].grid_data() );
227 }
228 else
229 {
230 throw std::runtime_error( "VectorQ1Scalar::lincomb: not implemented" );
231 }
232 }
233
234 /// @brief Dot product implementation for VectorLike concept.
235 /// Computes: \f$ \sum_{i} y_i \cdot x_i \f$ over owned nodes.
236 /// @param x Other vector.
237 /// @return Dot product value.
239 {
241 grid_data_, x.grid_data(), mask_data_, grid::NodeOwnershipFlag::OWNED );
242 }
243
244 /// @brief Invert entries implementation for VectorLike concept.
245 /// Computes: \f$ y_i = 1 / y_i \f$
247
248 /// @brief Elementwise scaling implementation for VectorLike concept.
249 /// Computes: \f$ y_i = y_i \cdot x_i \f$
250 /// @param x Scaling vector.
252 {
254 }
255
256 /// @brief Randomize entries implementation for VectorLike concept.
257 /// Sets each entry of grid_data to a random value.
258 void randomize_impl() { return kernels::common::rand( grid_data_ ); }
259
260 /// @brief Max absolute entry implementation for VectorLike concept.
261 /// Computes: \f$ \max_i |y_i| \f$
262 /// @return Maximum absolute value.
264
265 /// @brief NaN/inf check implementation for VectorLike concept.
266 /// Returns true if any entry of grid_data is NaN/inf.
267 /// @return True if NaN/inf is present.
268 bool has_nan_or_inf_impl() const { return kernels::common::has_nan_or_inf( grid_data_ ); }
269
270 /// @brief Swap implementation for VectorLike concept.
271 /// Exchanges grid_data and mask_data with another vector.
272 /// @param other Other vector.
273 void swap_impl( VectorQ1Vec& other )
274 {
275 std::swap( grid_data_, other.grid_data_ );
276 std::swap( mask_data_, other.mask_data_ );
277 }
278
279 /// @brief Get const reference to grid data.
280 const grid::Grid4DDataVec< ScalarType, VecDim >& grid_data() const { return grid_data_; }
281 /// @brief Get mutable reference to grid data.
283
284 /// @brief Get const reference to mask data.
286 /// @brief Get mutable reference to mask data.
288
289 private:
292};
293
294/// @brief Static assertion: VectorQ1Vec satisfies VectorLike concept.
295static_assert( VectorLike< VectorQ1Vec< double, 3 > > );
296
297} // namespace terra::linalg
Parallel data structure organizing the thick spherical shell metadata for distributed (MPI parallel) ...
Definition spherical_shell.hpp:2498
const std::map< SubdomainInfo, std::tuple< LocalSubdomainIdx, SubdomainNeighborhood > > & subdomains() const
Definition spherical_shell.hpp:2580
const DomainInfo & domain_info() const
Returns a const reference.
Definition spherical_shell.hpp:2577
int subdomain_num_nodes_radially() const
Equivalent to calling subdomain_num_nodes_radially( subdomain_refinement_level() )
Definition spherical_shell.hpp:861
int subdomain_num_nodes_per_side_laterally() const
Equivalent to calling subdomain_num_nodes_per_side_laterally( subdomain_refinement_level() )
Definition spherical_shell.hpp:852
Q1 scalar finite element vector on a distributed shell grid.
Definition vector_q1.hpp:21
ScalarType max_abs_entry_impl() const
Max absolute entry implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:120
grid::Grid4DDataScalar< grid::NodeOwnershipFlag > & mask_data()
Get mutable reference to mask data.
Definition vector_q1.hpp:144
VectorQ1Scalar(const std::string &label, const grid::shell::DistributedDomain &distributed_domain, const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > &mask_data)
Construct a Q1 scalar vector with label, domain, and mask data.
Definition vector_q1.hpp:33
ScalarType dot_impl(const VectorQ1Scalar &x) const
Dot product implementation for VectorLike concept. Computes: over owned nodes.
Definition vector_q1.hpp:95
VectorQ1Scalar()=default
Default constructor.
void scale_with_vector_impl(const VectorQ1Scalar &x)
Elementwise scaling implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:108
void swap_impl(VectorQ1Scalar &other)
Swap implementation for VectorLike concept. Exchanges grid_data and mask_data with another vector.
Definition vector_q1.hpp:130
void randomize_impl()
Randomize entries implementation for VectorLike concept. Sets each entry of grid_data to a random val...
Definition vector_q1.hpp:115
bool has_nan_or_inf_impl() const
NaN/inf check implementation for VectorLike concept. Returns true if any entry of grid_data is NaN/in...
Definition vector_q1.hpp:125
const grid::Grid4DDataScalar< ScalarType > & grid_data() const
Get const reference to grid data.
Definition vector_q1.hpp:137
ScalarT ScalarType
Scalar type of the vector.
Definition vector_q1.hpp:24
void invert_entries_impl()
Invert entries implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:103
grid::Grid4DDataScalar< ScalarType > & grid_data()
Get mutable reference to grid data.
Definition vector_q1.hpp:139
void lincomb_impl(const std::vector< ScalarType > &c, const std::vector< VectorQ1Scalar > &x, const ScalarType c0)
Linear combination implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:61
const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > & mask_data() const
Get const reference to mask data.
Definition vector_q1.hpp:142
Static assertion: VectorQ1Scalar satisfies VectorLike concept.
Definition vector_q1.hpp:162
ScalarT ScalarType
Scalar type of the vector.
Definition vector_q1.hpp:195
void swap_impl(VectorQ1Vec &other)
Swap implementation for VectorLike concept. Exchanges grid_data and mask_data with another vector.
Definition vector_q1.hpp:273
static const int Dim
Dimension of the vector field.
Definition vector_q1.hpp:197
VectorQ1Vec(const std::string &label, const grid::shell::DistributedDomain &distributed_domain, const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > &mask_data)
Construct a Q1 vector with label, domain, and mask data.
Definition vector_q1.hpp:171
void randomize_impl()
Randomize entries implementation for VectorLike concept. Sets each entry of grid_data to a random val...
Definition vector_q1.hpp:258
ScalarType max_abs_entry_impl() const
Max absolute entry implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:263
void lincomb_impl(const std::vector< ScalarType > &c, const std::vector< VectorQ1Vec > &x, const ScalarType c0)
Linear combination implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:204
bool has_nan_or_inf_impl() const
NaN/inf check implementation for VectorLike concept. Returns true if any entry of grid_data is NaN/in...
Definition vector_q1.hpp:268
VectorQ1Vec()=default
Default constructor.
grid::Grid4DDataScalar< grid::NodeOwnershipFlag > & mask_data()
Get mutable reference to mask data.
Definition vector_q1.hpp:287
void invert_entries_impl()
Invert entries implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:246
const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > & mask_data() const
Get const reference to mask data.
Definition vector_q1.hpp:285
void scale_with_vector_impl(const VectorQ1Vec &x)
Elementwise scaling implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:251
grid::Grid4DDataVec< ScalarType, VecDim > & grid_data()
Get mutable reference to grid data.
Definition vector_q1.hpp:282
ScalarType dot_impl(const VectorQ1Vec &x) const
Dot product implementation for VectorLike concept. Computes: over owned nodes.
Definition vector_q1.hpp:238
const grid::Grid4DDataVec< ScalarType, VecDim > & grid_data() const
Get const reference to grid data.
Definition vector_q1.hpp:280
Kokkos::View< ScalarType ****[VecDim], Layout > Grid4DDataVec
Definition grid_types.hpp:43
Kokkos::View< ScalarType ****, Layout > Grid4DDataScalar
Definition grid_types.hpp:25
void invert_inplace(const grid::Grid4DDataScalar< ScalarType > &y)
Definition grid_operations.hpp:302
bool has_nan_or_inf(const grid::Grid4DDataScalar< ScalarType > &x)
Definition grid_operations.hpp:742
ScalarType masked_dot_product(const grid::Grid4DDataScalar< ScalarType > &x, const grid::Grid4DDataScalar< ScalarType > &y, const grid::Grid4DDataScalar< FlagType > &mask, const FlagType &mask_value)
Definition grid_operations.hpp:689
void set_constant(const grid::Grid2DDataScalar< ScalarType > &x, ScalarType value)
Definition grid_operations.hpp:12
void mult_elementwise_inplace(const grid::Grid4DDataScalar< ScalarType > &y, const grid::Grid4DDataScalar< ScalarType > &x)
Definition grid_operations.hpp:329
void rand(const grid::Grid4DDataScalar< ScalarTypeDst > &dst)
Definition grid_operations.hpp:798
void lincomb(const grid::Grid4DDataScalar< ScalarType > &y, ScalarType c_0, ScalarType c_1, const grid::Grid4DDataScalar< ScalarType > &x_1)
Definition grid_operations.hpp:179
ScalarType max_abs_entry(const grid::Grid4DDataScalar< ScalarType > &x)
Definition grid_operations.hpp:400
Contains linear algebra utilities and functions for the Terra project.
Definition diagonally_scaled_operator.hpp:8