SpECTRE
v2024.08.03
|
RotScaleTrans map which applies a combination of rotation, expansion, and translation based on which maps are supplied. More...
#include <RotScaleTrans.hpp>
Public Types | |
enum class | BlockRegion { Inner , Transition , Outer } |
Public Member Functions | |
RotScaleTrans (std::optional< std::pair< std::string, std::string > > scale_f_of_t_names, std::optional< std::string > rot_f_of_t_name, std::optional< std::string > trans_f_of_t_name, double inner_radius, double outer_radius, BlockRegion region) | |
RotScaleTrans (const RotScaleTrans< Dim > &RotScaleTrans_Map)=default | |
RotScaleTrans (RotScaleTrans &&)=default | |
RotScaleTrans & | operator= (RotScaleTrans &&)=default |
RotScaleTrans & | operator= (const RotScaleTrans &RotScaleTrans_Map)=default |
template<typename T > | |
std::array< tt::remove_cvref_wrap_t< T >, Dim > | operator() (const std::array< T, Dim > &source_coords, double time, const std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > &functions_of_time) const |
std::optional< std::array< double, Dim > > | inverse (const std::array< double, Dim > &target_coords, double time, const std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > &functions_of_time) const |
The inverse function is only callable with doubles because the inverse might fail if called for a point out of range, and it is unclear what should happen if the inverse were to succeed for some points in a DataVector but fail for other points. | |
template<typename T > | |
std::array< tt::remove_cvref_wrap_t< T >, Dim > | frame_velocity (const std::array< T, Dim > &source_coords, double time, const std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > &functions_of_time) const |
template<typename T > | |
tnsr::Ij< tt::remove_cvref_wrap_t< T >, Dim, Frame::NoFrame > | inv_jacobian (const std::array< T, Dim > &source_coords, double time, const std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > &functions_of_time) const |
template<typename T > | |
tnsr::Ij< tt::remove_cvref_wrap_t< T >, Dim, Frame::NoFrame > | jacobian (const std::array< T, Dim > &source_coords, double time, const std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > &functions_of_time) const |
void | pup (PUP::er &p) |
const std::unordered_set< std::string > & | function_of_time_names () const |
Static Public Member Functions | |
static bool | is_identity () |
Static Public Attributes | |
static constexpr size_t | dim = Dim |
Friends | |
template<size_t LocalDim> | |
bool | operator== (const RotScaleTrans< LocalDim > &lhs, const RotScaleTrans< LocalDim > &rhs) |
RotScaleTrans map which applies a combination of rotation, expansion, and translation based on which maps are supplied.
This map adds a rotation, expansion and translation based on what types of maps are needed. Translation and expansion have piecewise functions that map the coordinates \(\vec{\xi}\) based on what region \(|\vec{\xi}|\) is in. Coordinates within the inner radius are translated by the translation function of time \(\vec{T}(t)\) and expanded by the inner expansion function of time \(E_{a}(t)\). Coordinates in between the inner radius and outer radius have a linear radial falloff applied to them. Coordinates at or beyond the outer radius have no translation applied and are expanded by the outer expansion function of time \(E_{b}(t)\). This map assumes that the center of the map is at (0., 0., 0.). There is an enum class to set which region your block is in. Specifying RotScaleTrans::BlockRegion::Inner treats coordinates as if they're inside the inner radius, setting RotScaleTrans::BlockRegion::Transition treats the points as if they're between the inner and outer radius, and setting RotScaleTrans::BlockRegion::Outer treats points as if they're on or beyond the outer boundary.
The RotScaleTrans map takes the coordinates \(\vec{\xi}\) to the target coordinates \(\vec{\bar{\xi}}\) through
\begin{equation} \vec{\bar{\xi}} = \left\{\begin{array}{ll}E_{a}(t)R(t)\vec{\xi} + \vec{T}(t), & |\vec{\xi}| \leq R_{in}, \\ (w_{E} + E_{a}(t))R(t)\vec{\xi} + (1 + w_{T})\vec{T}(t), & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ (w_{E} + E_{b}(t))R(t)\vec{\xi} + w_{T}\vec{T}(t), & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out}, \\ E_{b}(t)R(t)\vec{\xi}, & |\vec{\xi}| \geq R_{out} \end{array}\right. \end{equation}
Where \(R_{in}\) is the inner radius, \(R_{out}\) is the outer radius, and \(w_{T}\) is the translation falloff factor and \(w_{E}\) is the expansion falloff factor found through
\begin{equation} w_{E} = \left\{\begin{array}{ll}\frac{R_{in}(R_{out} - |\vec{\xi}|)(E_{a}(t) - E_{b}(t))}{|\vec{\xi}|(R_{out} - R_{in})}, & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ \frac{R_{out}(R_{in} - |\vec{\xi}|)(E_{a}(t) - E_{b}(t))}{|\vec{\xi}|(R_{out} - R_{in})}, & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out} \end{array}\right. \end{equation}
and
\begin{equation} w_{T} = \left\{\begin{array}{ll}\frac{R_{in} - |\vec{\xi}|}{R_{out} - R_{in}}, & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ \frac{R_{out} - |\vec{\xi}|}{R_{out} - R_{in}}, & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out} \end{array}\right. \end{equation}
\(w_{E}\) and \(w_{T}\) are calculated differently based on if you're closer to the inner radius or outer radius to reduce roundoff error.
The inverse function maps the coordinates \(\vec{\bar{\xi}}\) back to the original coordinates \(\vec{\xi}\) through different equations based on which maps are supplied.
If Rotation, Expansion, and Translation Maps are supplied then the inverse is given by
\begin{equation} \label{eq:full_inverse} \vec{\xi} = \left\{\begin{array}{ll}R^{T}(t)(\frac{(\vec{\bar{\xi}} - \vec{T}(t))}{E_{a}(t)}), & |\vec{\bar{\xi}}| \leq R_{in}E_{a}(t), \\ R^{T}(t)\frac{\vec{\bar{\xi}} - w_{T}\vec{T}(t)}{w_{E}}, & R_{in}E_{a}(t) < |\vec{\bar{\xi}}| \leq 0.5(R_{in}E_{a}(t) + R_{out}E_{b}(t)), \\ R^{T}(t)\frac{\vec{\bar{\xi}} - (1.0 - w_{T})\vec{T}(t)}{w_{E}}, & 0.5(R_{in}E_{a}(t) + R_{out}E_{b}(t)) < |\vec{\bar{\xi}}| < R_{out}E_{b}(t), \\ R^{T}(t)\frac{\vec{\bar{\xi}}}{E_{b}(t)}, & |\vec{\bar{\xi}}| \geq R_{out}E_{b}(t) \end{array}\right. \end{equation}
Where \(w_{T}\) and \(w_{E}\) are found through different quadratic solves.
When closer to \(R_{in}\) the quadratic has the form
\begin{equation} w_{T}^2((E_{a}(t)R_{in} - E_{b}(t)R_{out})^2 - T(t)^2) + 2w_{T}(E_{a}(t)R_{in}(E_{b}(t)R_{out} - E_{a}(t)R_{in}) + \vec{T}(t) \cdot (\vec{T}(t) - \vec{\bar{\xi}})) + \vec{T}(t) \cdot \vec{\bar{\xi}}) + E_{a}(t)^2 R_{in}^2 - (\vec{\bar{\xi}} - \vec{T}(t))^2 \end{equation}
where \(w_{E} = \frac{(1.0 - w_{T})R_{in}E_{a}(t) + w_{T}R_{out}E_{b}(t)}{(1.0 - w_{T})R_{in} + w_{T}R_{out}}\)
When closer to \(R_{out}\) the quadratic has the form
\begin{equation} w_{T}^2((E_{a}(t)R_{in} - E_{b}(t)R_{out})^2 - T(t)^2) + 2w_{T}(E_{b}(t)R_{out}(E_{a}(t)R_{in} - E_{b}(t)R_{out}) + \vec{T}(t) \cdot \vec{\bar{\xi}}) + E_{b}(t)^2 R_{out}^2 - \vec{\bar{\xi}}^2 \end{equation}
where \(w_{E} = \frac{w_{T}R_{in}E_{a}(t) + (1.0 - w_{T})R_{out}E_{b}(t)}{w_{T}R_{in} + (1.0 - w_{T})R_{out}}\)
If Rotation and Expansion are supplied then the inverse is given by
\begin{equation} \vec{\xi} = \left\{\begin{array}{ll}R^{T}(t)(\frac{\vec{\bar{\xi}}}{E_{a}(t)}), & |\vec{\bar{\xi}}| \leq R_{in}E_{a}(t), \\ R^{T}(t)\frac{\vec{\bar{\xi}}}{w_{E}}, & R_{in}E_{a}(t) < |\vec{\bar{\xi}}| \leq 0.5(R_{in}E_{a}(t) + R_{out}E_{b}(t)), \\ R^{T}(t)\frac{\vec{\bar{\xi}}}{w_{E}}, & 0.5(R_{in}E_{a}(t) + R_{out}E_{b}(t)) < |\vec{\bar{\xi}}| < R_{out}E_{b}(t), \\ R^{T}(t)\frac{\vec{\bar{\xi}}}{E_{b}(t)}, & |\vec{\bar{\xi}}| \geq R_{out}E_{b}(t) \end{array}\right. \end{equation}
Where \(w_{E}\) is found through different quadratic solves.
When closer to \(R_{in}\) the quadratic has the form
\begin{equation} w^2(E_{a}(t)R_{in} - E_{b}(t)R_{out})^2 + 2wE_{a}(t)R_{in}(E_{b}(t)R_{out} - E_{a}(t)R_{in}) + (E_{a}(t) R_{in})^2 - \bar{\xi}^2 \end{equation}
with \(w_{E} = \frac{E_{a}(t)R_{in}(1.0 - w) + wE_{b}(t)R_{out}}{R_{in}(1.0 - w) + wR_{out}}\)
When closer to \(R_{out}\) the quadratic has the form
\begin{equation} w^2(E_{a}(t)R_{in} - E_{b}(t)R_{out})^2 + 2wE_{b}(t)R_{out}(E_{a}(t)R_{in} - E_{b}(t)R_{out}) + (E_{b}(t) R_{out})^2 - \bar{\xi}^2 \end{equation}
with \(w_{E} = \frac{wE_{a}(t)R_{in} + E_{b}(t)R_{out}(1.0 - w)}{wR_{in} + R_{out}(1.0 - w)}\)
If Rotation and Translation are supplied, then the inverse is given by
\begin{equation} \vec{\xi} = \left\{\begin{array}{ll}R^{T}(t)(\vec{\bar{\xi}} - \vec{T}(t)), & |\vec{\bar{\xi}}| \leq R_{in}, \\ R^{T}(t)(\vec{\bar{\xi}} - w_{T}\vec{T}(t)), & R_{in} < |\vec{\bar{\xi}}| \leq 0.5(R_{in} + R_{out}), \\ R^{T}(t)(\vec{\bar{\xi}} - (1.0 - w_{T})\vec{T}(t)), & 0.5(R_{in} + R_{out}) < |\vec{\bar{\xi}}| < R_{out}, \\ R^{T}(t)\vec{\bar{\xi}}, & |\vec{\bar{\xi}}| \geq R_{out} \end{array}\right. \end{equation}
Where \(w_{T}\) is found through different quadratic solves.
When closer to \(R_{in}\) the quadratic has the form
\begin{equation} w_{T}^2(T(t)^2 - (R_{out} - R_{in})^2) - 2w_{T}(\vec{T}(t) \cdot (\vec{T}(t) - \vec{\bar{\xi}}) + R_{in}(R_{out} - R_{in}) + (\vec{T}(t) - \vec{\bar{\xi}})^2 - R_{in}^2 \end{equation}
When closer to \(R_{out}\) the quadratic has the form
\begin{equation} w_{T}^2(T(t)^2 - (R_{out} - R_{in})^2) + 2w_{T}(R_{out}(R_{out} - R_{in}) - \vec{T}(t) \cdot \vec{\bar{\xi}}) + \vec{\bar{\xi}}^2 - R_{out}^2 \end{equation}
If Expansion and Translation are supplied, then the inverse is given by Eq. \(\ref{eq:full_inverse}\), with no transpose of rotation applied.
The Frame Velocity is found through different equations based on which maps are supplied.
If Rotation, Expansion, and Translation are supplied then the frame velocity is found through
\begin{equation} \vec{v} = \left\{\begin{array}{ll}(E_{a}(t)dR(t) + dE_{a}(t)R(t))\vec{\xi} + d \vec{T}(t), & |\vec{\xi}| \leq R_{in}, \\ ((E_{a}(t) + w_{E})dR(t) + (dE_{a}(t) + dw_{E})R(t))\vec{\xi} + (1 + w_{T})d \vec{T}(t), & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ ((E_{b}(t) + w_{E})dR(t) + (dE_{b}(t) + dw_{E})R(t))\vec{\xi} + w_{T}d \vec{T}(t), & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out}, \\ (E_{b}(t)dR(t) + dE_{b}(t)R(t))\vec{\xi}, & |\vec{\xi}| \geq R_{out} \end{array}\right. \end{equation}
where \(dw_{E}\) is the derivative of the \(w_{E}\) given by
\begin{equation} dw_{E} = \left\{\begin{array}{ll}\frac{R_{out}(R_{in} - |\vec{\xi}|)(dE_{a}(t) - dE_{b}(t))}{|\vec{\xi}|(R_{out} - R_{in})}, & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ \frac{R_{in}(R_{out} - |\vec{\xi}|)(dE_{a}(t) - dE_{b}(t))}{|\vec{\xi}|(R_{out} - R_{in})}, & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out} \end{array}\right. \end{equation}
The jacobian is also found through different equations based on which maps are supplied.
If Rotation, Expansion and Translation maps are supplied then the jacobian is found through
\begin{equation} {J^{i}}_{j} = \left\{\begin{array}{ll}E_{a}(t){R^{i}}_{j}(t), & |\vec{\xi}| \leq R_{in}, \\ {R^{i}}_{j}(t)E_{a}(t) + \frac{\alpha {R^{i}}_{l}(t)\vec{\xi}^{l}\vec{\xi}_{j}(E_{A}(t) - E_{B}(t))}{|\vec{\xi}|} + w_{E}{R^{i}}_{j}(t) + \frac{dw_{T}T^{i}\xi_{j}}{|\vec{\xi}|}, & R_{in} < |\vec{\xi}| \leq 0.5(R_{in} + R_{out}), \\ {R^{i}}_{j}(t)E_{b}(t) + \frac{\alpha {R^{i}}_{l}(t)\vec{\xi}^{l}\vec{\xi}_{j}(E_{A}(t) - E_{B}(t))}{|\vec{\xi}|} + w_{E}{R^{i}}_{j}(t) + \frac{dw_{T}T^{i}\xi_{j}}{|\vec{\xi}|}, & 0.5(R_{in} + R_{out}) < |\vec{\xi}| < R_{out}, \\ E_{b}(t){R^{i}}_{j}(t), & |\vec{\xi}| \geq R_{out} \end{array}\right. \end{equation}
where \(\alpha = \frac{R_{in}R_{out}}{\vec{\xi}^2(R_{in} - R_{out})}\) and \(dw_{T} = \frac{-1.0}{R_{out} - R_{in}}\)
The inverse jacobian is computed numerically by inverting the jacobian.
|
strong |