SpECTRE
v2024.09.29
|
Map from a 3D unit right cylindrical shell to a volume that connects portions of two spherical surfaces. More...
#include <CylindricalSide.hpp>
Public Member Functions | |
CylindricalSide (const std::array< double, 3 > ¢er_one, const std::array< double, 3 > ¢er_two, const std::array< double, 3 > &proj_center, double radius_one, double radius_two, double z_lower, double z_upper) | |
CylindricalSide (CylindricalSide &&)=default | |
CylindricalSide (const CylindricalSide &)=default | |
CylindricalSide & | operator= (const CylindricalSide &)=default |
CylindricalSide & | operator= (CylindricalSide &&)=default |
template<typename T > | |
std::array< tt::remove_cvref_wrap_t< T >, 3 > | operator() (const std::array< T, 3 > &source_coords) const |
std::optional< std::array< double, 3 > > | inverse (const std::array< double, 3 > &target_coords) const |
template<typename T > | |
tnsr::Ij< tt::remove_cvref_wrap_t< T >, 3, Frame::NoFrame > | jacobian (const std::array< T, 3 > &source_coords) const |
template<typename T > | |
tnsr::Ij< tt::remove_cvref_wrap_t< T >, 3, Frame::NoFrame > | inv_jacobian (const std::array< T, 3 > &source_coords) const |
void | pup (PUP::er &p) |
Static Public Member Functions | |
static bool | is_identity () |
Static Public Attributes | |
static constexpr size_t | dim = 3 |
Friends | |
bool | operator== (const CylindricalSide &lhs, const CylindricalSide &rhs) |
Map from a 3D unit right cylindrical shell to a volume that connects portions of two spherical surfaces.
Consider two spheres with centers \(C_1\) and \(C_2\), and radii \(R_1\) and \(R_2\). Let sphere 1 be intersected by two planes normal to the \(z\) axis and located at \(z = z_\mathrm{L}\) and \(z = z_\mathrm{U}\), with \(z_\mathrm{L} < z_\mathrm{U}\). Also let there be a projection point \(P\).
Note that Sphere 1 and Sphere 2 are not equivalent, because the mapped portion of Sphere 1 is bounded by planes of constant \(z\) but the mapped portion of Sphere 2 is not (except for special choices of \(C_1\), \(C_2\), and \(P\)).
CylindricalSide maps a 3D unit right cylindrical shell (with coordinates \((\bar{x},\bar{y},\bar{z})\) such that \(-1\leq\bar{z}\leq 1\) and \(1 \leq \bar{x}^2+\bar{y}^2 \leq 4\)) to the shaded area in each panel of the figure above (with coordinates \((x,y,z)\)). The figure shows two different allowed possibilities: \(R_1 > R_2\) and \(R_2 > R_1\). Note that the two portions of the shaded region in each panel of the figure represent different portions of the same block; each panel of the figure is to be understood as rotated around the \(z\) axis. The inner boundary of the cylindrical shell \(\bar{x}^2+\bar{y}^2=1\) is mapped to the portion of sphere 1 that has \(z_\mathrm{L} \leq z \leq z_\mathrm{U}\). Curves of constant \((\bar{z})\) along the vector \((\bar{x},\bar{y})\) are mapped to portions of lines that pass through \(P\). Along each of these curves, \(\bar{x}^2+\bar{y}^2=1\) is mapped to a point on sphere 1 and \(\bar{x}^2+\bar{y}^2=4\) is mapped to a point on sphere 2.
CylindricalSide is described briefly in the Appendix of [32]. CylindricalSide is used to construct the blocks labeled 'CA cylinder', 'EA cylinder', 'CB cylinder', 'EE cylinder', and 'EB cylinder' in Figure 20 of that paper. Note that 'CA cylinder', 'CB cylinder', and 'EE cylinder' have Sphere 1 contained in Sphere2, and 'EA cylinder' and 'EB cylinder' have Sphere 2 contained in Sphere 1.
CylindricalSide is implemented using FocallyLiftedMap
and FocallyLiftedInnerMaps::Side
; see those classes for details.
We demand that: