Team-based matrix-free Gradient operator for the spherical shell, with the same fused-arithmetic optimisations applied to DivergenceKerngen / EpsilonDivDivKerngen.
More...
#include "../../quadrature/quadrature.hpp"#include "communication/shell/communication.hpp"#include "communication/shell/communication_plan.hpp"#include "dense/vec.hpp"#include "fe/wedge/integrands.hpp"#include "fe/wedge/kernel_helpers.hpp"#include "grid/shell/spherical_shell.hpp"#include "linalg/operator.hpp"#include "linalg/trafo/local_basis_trafo_normal_tangential.hpp"#include "linalg/vector.hpp"#include "linalg/vector_q1.hpp"#include "util/timer.hpp"Go to the source code of this file.
Classes | |
| class | terra::fe::wedge::operators::shell::GradientKerngen< ScalarT > |
Namespaces | |
| namespace | terra |
| namespace | terra::fe |
| namespace | terra::fe::wedge |
| Features for wedge elements. | |
| namespace | terra::fe::wedge::operators |
| namespace | terra::fe::wedge::operators::shell |
Team-based matrix-free Gradient operator for the spherical shell, with the same fused-arithmetic optimisations applied to DivergenceKerngen / EpsilonDivDivKerngen.
Structure mirrors DivergenceKerngen — but Gradient is the transpose of Divergence:
Fused arithmetic derivation. The original element-matrix form is A[wedge](d·6+i, j) = -qw · |det J| · (J⁻ᵀ ∇N_i)_d · shape_coarse_j so dst_{d,i} = Σⱼ A(d·6+i, j) · p_j = -qw · |det J| · (J⁻ᵀ ∇N_i)_d · Σⱼ shape_coarse_j · p_j = -qw · |det J| · (J⁻ᵀ ∇N_i)_d · p_interp, where p_interp is the interpolated coarse pressure at the quadrature point. We never materialise A.
Per wedge:
The freeslip projection uses the fact that on a spherical shell the outward normal at a lateral node equals the unit-sphere coord already cached in coords_sh — same trick as DivergenceKerngen, applied to the output side here.