Loading...
Searching...
No Matches
epsilon_divdiv_stokes.hpp
Go to the documentation of this file.
1
2#pragma once
3
5#include "divergence.hpp"
6#include "epsilon_divdiv.hpp"
8#include "gradient.hpp"
10#include "linalg/operator.hpp"
12#include "util/timer.hpp"
13#include "zero.hpp"
14
17
18template < typename ScalarT, int VecDim = 3 >
20{
21 public:
24 using ScalarType = ScalarT;
25
30
31 private:
32 Block11Type A_;
36
37 bool diagonal_;
38
39 public:
41 const grid::shell::DistributedDomain& domain_fine,
42 const grid::shell::DistributedDomain& domain_coarse,
47 BoundaryConditions bcs,
48 bool diagonal )
49 : A_( domain_fine, grid, radii, mask, k, bcs, diagonal )
50 , B_T_( domain_fine, domain_coarse, grid, radii, mask, bcs )
51 , B_( domain_fine, domain_coarse, grid, radii, mask, bcs )
52 , diagonal_( diagonal )
53 {}
54
85
86 const Block11Type& block_11() const { return A_; }
87
88 const Block12Type& block_12() const
89 {
90 if ( diagonal_ )
91 {
92 throw std::runtime_error( "block_12() is not implemented for diagonal Stokes operator" );
93 }
94
95 return B_T_;
96 }
97
98 const Block21Type& block_21() const
99 {
100 if ( diagonal_ )
101 {
102 throw std::runtime_error( "block_21() is not implemented for diagonal Stokes operator" );
103 }
104
105 return B_;
106 }
107
108 const Block22Type& block_22() const { return O_; }
109
110 Block11Type& block_11() { return A_; }
112 {
113 if ( diagonal_ )
114 {
115 throw std::runtime_error( "block_12() is not implemented for diagonal Stokes operator" );
116 }
117
118 return B_T_;
119 }
121 {
122 if ( diagonal_ )
123 {
124 throw std::runtime_error( "block_21() is not implemented for diagonal Stokes operator" );
125 }
126
127 return B_;
128 }
129 Block22Type& block_22() { return O_; }
130};
131
133
134} // namespace terra::fe::wedge::operators::shell
void set_operator_apply_and_communication_modes(const linalg::OperatorApplyMode operator_apply_mode, const linalg::OperatorCommunicationMode operator_communication_mode)
Definition divergence.hpp:82
Definition epsilon_divdiv_stokes.hpp:20
Block22Type & block_22()
Definition epsilon_divdiv_stokes.hpp:129
Block11Type & block_11()
Definition epsilon_divdiv_stokes.hpp:110
ScalarT ScalarType
Definition epsilon_divdiv_stokes.hpp:24
Block21Type & block_21()
Definition epsilon_divdiv_stokes.hpp:120
Block12Type & block_12()
Definition epsilon_divdiv_stokes.hpp:111
const Block21Type & block_21() const
Definition epsilon_divdiv_stokes.hpp:98
const Block22Type & block_22() const
Definition epsilon_divdiv_stokes.hpp:108
const Block12Type & block_12() const
Definition epsilon_divdiv_stokes.hpp:88
EpsDivDivStokes(const grid::shell::DistributedDomain &domain_fine, const grid::shell::DistributedDomain &domain_coarse, const grid::Grid3DDataVec< ScalarType, 3 > &grid, const grid::Grid2DDataScalar< ScalarType > &radii, const grid::Grid4DDataScalar< grid::shell::ShellBoundaryFlag > &mask, const grid::Grid4DDataScalar< ScalarType > &k, BoundaryConditions bcs, bool diagonal)
Definition epsilon_divdiv_stokes.hpp:40
void apply_impl(const SrcVectorType &src, DstVectorType &dst)
Definition epsilon_divdiv_stokes.hpp:55
const Block11Type & block_11() const
Definition epsilon_divdiv_stokes.hpp:86
Matrix-free / matrix-based epsilon-div-div operator on wedge elements in a spherical shell.
Definition epsilon_divdiv_kerngen.hpp:58
void set_operator_apply_and_communication_modes(const linalg::OperatorApplyMode operator_apply_mode, const linalg::OperatorCommunicationMode operator_communication_mode)
Definition epsilon_divdiv_kerngen.hpp:216
void set_operator_apply_and_communication_modes(const linalg::OperatorApplyMode operator_apply_mode, const linalg::OperatorCommunicationMode operator_communication_mode)
Definition gradient.hpp:79
Parallel data structure organizing the thick spherical shell metadata for distributed (MPI parallel) ...
Definition spherical_shell.hpp:2498
Block vector consisting of a Q1 vector and a Q1 scalar vector on distributed shell grids.
Definition vector_q1isoq2_q1.hpp:20
const Block1Type & block_1() const
Get const reference to block 1 (vector field).
Definition vector_q1isoq2_q1.hpp:138
const Block2Type & block_2() const
Get const reference to block 2 (scalar field).
Definition vector_q1isoq2_q1.hpp:140
Timer supporting RAII scope or manual stop.
Definition timer.hpp:270
Concept for types that behave like block 2x2 operators. Extends OperatorLike and requires block types...
Definition operator.hpp:117
Definition boundary_mass.hpp:14
BoundaryConditionMapping[2] BoundaryConditions
Definition shell/bit_masks.hpp:37
Kokkos::View< ScalarType ***[VecDim], Layout > Grid3DDataVec
Definition grid_types.hpp:40
Kokkos::View< ScalarType ****, Layout > Grid4DDataScalar
Definition grid_types.hpp:25
Kokkos::View< ScalarType **, Layout > Grid2DDataScalar
Definition grid_types.hpp:19
@ Replace
Overwrite the destination vector.
@ Add
Add to the destination vector.
@ CommunicateAdditively
Communicate and add results.