Loading...
Searching...
No Matches
vector_q1isoq2_q1.hpp
Go to the documentation of this file.
1#pragma once
2#include <mpi.h>
3
7#include "vector.hpp"
8#include "vector_q1.hpp"
9
10namespace terra::linalg {
11
12/// @brief Block vector consisting of a Q1 vector and a Q1 scalar vector on distributed shell grids.
13///
14/// Same layout as required for tensor-product wedge elements.
15///
16/// Satisfies the Block2VectorLike concept (see vector.hpp).
17/// Used for mixed finite element methods (e.g., Q1isoQ2-Q1).
18template < typename ScalarT, int VecDim = 3 >
20{
21 public:
22 /// @brief Scalar type of the block vector.
23 using ScalarType = ScalarT;
24
25 /// @brief Type of the first block (vector field).
27 /// @brief Type of the second block (scalar field).
29
30 /// @brief Default constructor.
31 VectorQ1IsoQ2Q1() = default;
32
33 /// @brief Construct a block vector with labels, domains, and mask data for both blocks.
34 /// @param label Name for the vector.
35 /// @param distributed_domain_fine Distributed shell domain for the vector block.
36 /// @param distributed_domain_coarse Distributed shell domain for the scalar block.
37 /// @param mask_data_fine Mask data for the vector block.
38 /// @param mask_data_coarse Mask data for the scalar block.
40 const std::string& label,
41 const grid::shell::DistributedDomain& distributed_domain_fine,
42 const grid::shell::DistributedDomain& distributed_domain_coarse,
45 : u_( label + "_u", distributed_domain_fine, mask_data_fine )
46 , p_( label + "_p", distributed_domain_coarse, mask_data_coarse )
47 {}
48
49 /// @brief Linear combination implementation for Block2VectorLike concept.
50 /// Computes: \‍( \text{block}_1 = c_0 + \sum_i c_i x_i.\text{block}_1 \‍), \‍( \text{block}_2 = c_0 + \sum_i c_i x_i.\text{block}_2 \‍)
51 /// @param c Coefficients.
52 /// @param x Input block vectors.
53 /// @param c0 Scalar to add.
54 void
55 lincomb_impl( const std::vector< ScalarType >& c, const std::vector< VectorQ1IsoQ2Q1 >& x, const ScalarType c0 )
56 {
57 std::vector< Block1Type > us;
58 std::vector< Block2Type > ps;
59
60 for ( const auto& xx : x )
61 {
62 us.emplace_back( xx.block_1() );
63 ps.emplace_back( xx.block_2() );
64 }
65
66 u_.lincomb_impl( c, us, c0 );
67 p_.lincomb_impl( c, ps, c0 );
68 }
69
70 /// @brief Dot product implementation for Block2VectorLike concept.
71 /// Computes: \‍( \text{block}_1 \cdot x.\text{block}_1 + \text{block}_2 \cdot x.\text{block}_2 \‍)
72 /// @param x Other block vector.
73 /// @return Dot product value.
75 {
76 return x.block_1().dot_impl( u_ ) + x.block_2().dot_impl( p_ );
77 }
78
79 /// @brief Invert entries implementation for Block2VectorLike concept.
80 /// Computes: \‍( \text{block}_1 = 1 / \text{block}_1 \‍), \‍( \text{block}_2 = 1 / \text{block}_2 \‍)
86
87 /// @brief Elementwise scaling implementation for Block2VectorLike concept.
88 /// Computes: \‍( \text{block}_1 = \text{block}_1 \cdot x.\text{block}_1 \‍), \‍( \text{block}_2 = \text{block}_2 \cdot x.\text{block}_2 \‍)
89 /// @param x Scaling block vector.
95
96 /// @brief Randomize entries implementation for Block2VectorLike concept.
97 /// Sets each entry of both blocks to a random value.
99 {
102 }
103
104 /// @brief Max absolute entry implementation for Block2VectorLike concept.
105 /// Computes: \‍( \max( \max_i |\text{block}_1|, \max_j |\text{block}_2| ) \‍)
106 /// @return Maximum absolute value across both blocks.
108 {
109 return std::max( block_1().max_abs_entry_impl(), block_2().max_abs_entry_impl() );
110 }
111
112 /// @brief NaN/inf check implementation for Block2VectorLike concept.
113 /// Returns true if any entry of either block is NaN/inf.
114 /// @return True if NaN/inf is present.
116
117 /// @brief Swap implementation for Block2VectorLike concept.
118 /// Exchanges the contents of both blocks with another block vector.
119 /// @param other Other block vector.
121 {
122 u_.swap_impl( other.u_ );
123 p_.swap_impl( other.p_ );
124 }
125
126 /// @brief Add mask data to both blocks.
127 /// @param mask_data_block_1 Mask data for block 1.
128 /// @param mask_data_block_2 Mask data for block 2.
130 const grid::Grid4DDataScalar< unsigned char >& mask_data_block_1,
131 const grid::Grid4DDataScalar< unsigned char >& mask_data_block_2 )
132 {
133 block_1().mask_data() = mask_data_block_1;
134 block_2().mask_data() = mask_data_block_2;
135 }
136
137 /// @brief Get const reference to block 1 (vector field).
138 const Block1Type& block_1() const { return u_; }
139 /// @brief Get const reference to block 2 (scalar field).
140 const Block2Type& block_2() const { return p_; }
141
142 /// @brief Get mutable reference to block 1 (vector field).
143 Block1Type& block_1() { return u_; }
144 /// @brief Get mutable reference to block 2 (scalar field).
145 Block2Type& block_2() { return p_; }
146
147 private:
148 Block1Type u_; ///< Vector block (velocity, etc.)
149 Block2Type p_; ///< Scalar block (pressure, etc.)
150};
151
152/// @brief Static assertion: VectorQ1IsoQ2Q1 satisfies Block2VectorLike concept.
153static_assert( Block2VectorLike< VectorQ1IsoQ2Q1< double > > );
154
155/// @brief Allocate a VectorQ1IsoQ2Q1 block vector with grid data for both blocks.
156/// @param label Name for the vector.
157/// @param distributed_domain_fine Distributed shell domain for the vector block.
158/// @param distributed_domain_coarse Distributed shell domain for the scalar block.
159/// @param level Multigrid level.
160/// @return Allocated VectorQ1IsoQ2Q1 block vector.
161template < typename ValueType, int VecDim = 3 >
163 const std::string label,
164 const grid::shell::DistributedDomain& distributed_domain_fine,
165 const grid::shell::DistributedDomain& distributed_domain_coarse,
166 const int level )
167{
169 label,
170 distributed_domain_fine.subdomains().size(),
171 distributed_domain_fine.domain_info().subdomain_num_nodes_per_side_laterally(),
172 distributed_domain_fine.domain_info().subdomain_num_nodes_per_side_laterally(),
173 distributed_domain_fine.domain_info().subdomain_num_nodes_radially() );
174
176 label,
177 distributed_domain_coarse.subdomains().size(),
178 distributed_domain_coarse.domain_info().subdomain_num_nodes_per_side_laterally(),
179 distributed_domain_coarse.domain_info().subdomain_num_nodes_per_side_laterally(),
180 distributed_domain_coarse.domain_info().subdomain_num_nodes_radially() );
181
182 VectorQ1IsoQ2Q1< ValueType, VecDim > vector_q1isoq2_q1;
183 vector_q1isoq2_q1.block_1().add_grid_data( grid_data_fine, level );
184 vector_q1isoq2_q1.block_2().add_grid_data( grid_data_coarse, level );
185 return vector_q1isoq2_q1;
186}
187
188} // 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
Block vector consisting of a Q1 vector and a Q1 scalar vector on distributed shell grids.
Definition vector_q1isoq2_q1.hpp:20
bool has_nan_or_inf_impl() const
NaN/inf check implementation for Block2VectorLike concept. Returns true if any entry of either block ...
Definition vector_q1isoq2_q1.hpp:115
void invert_entries_impl()
Invert entries implementation for Block2VectorLike concept. Computes: ( \text{block}_1 = 1 / \text{bl...
Definition vector_q1isoq2_q1.hpp:81
void add_mask_data(const grid::Grid4DDataScalar< unsigned char > &mask_data_block_1, const grid::Grid4DDataScalar< unsigned char > &mask_data_block_2)
Add mask data to both blocks.
Definition vector_q1isoq2_q1.hpp:129
const Block1Type & block_1() const
Get const reference to block 1 (vector field).
Definition vector_q1isoq2_q1.hpp:138
void swap_impl(VectorQ1IsoQ2Q1 &other)
Swap implementation for Block2VectorLike concept. Exchanges the contents of both blocks with another ...
Definition vector_q1isoq2_q1.hpp:120
VectorQ1Scalar< ScalarType > Block2Type
Type of the second block (scalar field).
Definition vector_q1isoq2_q1.hpp:28
Block2Type & block_2()
Get mutable reference to block 2 (scalar field).
Definition vector_q1isoq2_q1.hpp:145
ScalarT ScalarType
Scalar type of the block vector.
Definition vector_q1isoq2_q1.hpp:23
ScalarType dot_impl(const VectorQ1IsoQ2Q1 &x) const
Dot product implementation for Block2VectorLike concept. Computes: ( \text{block}_1 \cdot x....
Definition vector_q1isoq2_q1.hpp:74
VectorQ1IsoQ2Q1(const std::string &label, const grid::shell::DistributedDomain &distributed_domain_fine, const grid::shell::DistributedDomain &distributed_domain_coarse, const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > &mask_data_fine, const grid::Grid4DDataScalar< grid::NodeOwnershipFlag > &mask_data_coarse)
Construct a block vector with labels, domains, and mask data for both blocks.
Definition vector_q1isoq2_q1.hpp:39
void scale_with_vector_impl(const VectorQ1IsoQ2Q1 &x)
Elementwise scaling implementation for Block2VectorLike concept. Computes: ( \text{block}_1 = \text{b...
Definition vector_q1isoq2_q1.hpp:90
void randomize_impl()
Randomize entries implementation for Block2VectorLike concept. Sets each entry of both blocks to a ra...
Definition vector_q1isoq2_q1.hpp:98
const Block2Type & block_2() const
Get const reference to block 2 (scalar field).
Definition vector_q1isoq2_q1.hpp:140
Block1Type & block_1()
Get mutable reference to block 1 (vector field).
Definition vector_q1isoq2_q1.hpp:143
VectorQ1IsoQ2Q1()=default
Default constructor.
void lincomb_impl(const std::vector< ScalarType > &c, const std::vector< VectorQ1IsoQ2Q1 > &x, const ScalarType c0)
Linear combination implementation for Block2VectorLike concept. Computes: ( \text{block}_1 = c_0 + \s...
Definition vector_q1isoq2_q1.hpp:55
ScalarType max_abs_entry_impl() const
Max absolute entry implementation for Block2VectorLike concept. Computes: ( \max( \max_i |\text{block...
Definition vector_q1isoq2_q1.hpp:107
VectorQ1Vec< ScalarType, VecDim > Block1Type
Type of the first block (vector field).
Definition vector_q1isoq2_q1.hpp:26
ScalarType dot_impl(const VectorQ1Scalar &x) const
Dot product implementation for VectorLike concept. Computes: over owned nodes.
Definition vector_q1.hpp:95
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
void invert_entries_impl()
Invert entries implementation for VectorLike concept. Computes: .
Definition vector_q1.hpp:103
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
void swap_impl(VectorQ1Vec &other)
Swap implementation for VectorLike concept. Exchanges grid_data and mask_data with another vector.
Definition vector_q1.hpp:273
void randomize_impl()
Randomize entries implementation for VectorLike concept. Sets each entry of grid_data to a random val...
Definition vector_q1.hpp:258
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
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
ScalarType dot_impl(const VectorQ1Vec &x) const
Dot product implementation for VectorLike concept. Computes: over owned nodes.
Definition vector_q1.hpp:238
Kokkos::View< ScalarType ****[VecDim], Layout > Grid4DDataVec
Definition grid_types.hpp:43
Kokkos::View< ScalarType ****, Layout > Grid4DDataScalar
Definition grid_types.hpp:25
Contains linear algebra utilities and functions for the Terra project.
Definition diagonally_scaled_operator.hpp:8
VectorQ1IsoQ2Q1< ValueType, VecDim > allocate_vector_q1isoq2_q1(const std::string label, const grid::shell::DistributedDomain &distributed_domain_fine, const grid::shell::DistributedDomain &distributed_domain_coarse, const int level)
Static assertion: VectorQ1IsoQ2Q1 satisfies Block2VectorLike concept.
Definition vector_q1isoq2_q1.hpp:162