Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Defines the class Identity. 6 : 7 : #pragma once 8 : 9 : #include <array> 10 : #include <cstddef> 11 : #include <optional> 12 : 13 : #include "DataStructures/Tensor/TypeAliases.hpp" 14 : 15 : /// \cond 16 : namespace PUP { 17 : class er; 18 : } // namespace PUP 19 : /// \endcond 20 : 21 : namespace domain { 22 : namespace CoordinateMaps { 23 : 24 : /// \ingroup CoordinateMapsGroup 25 : /// Identity map from \f$\xi \rightarrow x\f$. 26 : template <size_t Dim> 27 1 : class Identity { 28 : public: 29 0 : static constexpr size_t dim = Dim; 30 : 31 0 : Identity() = default; 32 0 : ~Identity() = default; 33 0 : Identity(const Identity&) = default; 34 0 : Identity(Identity&&) = default; // NOLINT 35 0 : Identity& operator=(const Identity&) = default; 36 0 : Identity& operator=(Identity&&) = default; 37 : 38 : template <typename T> 39 0 : std::array<T, Dim> operator()(const std::array<T, Dim>& source_coords) const; 40 : 41 : /// The inverse function is only callable with doubles because the inverse 42 : /// might fail if called for a point out of range, and it is unclear 43 : /// what should happen if the inverse were to succeed for some points in a 44 : /// DataVector but fail for other points. 45 1 : std::optional<std::array<double, Dim>> inverse( 46 : const std::array<double, Dim>& target_coords) const; 47 : 48 : template <typename T> 49 0 : tnsr::Ij<T, Dim, Frame::NoFrame> jacobian( 50 : const std::array<T, Dim>& source_coords) const; 51 : 52 : template <typename T> 53 0 : tnsr::Ij<T, Dim, Frame::NoFrame> inv_jacobian( 54 : const std::array<T, Dim>& source_coords) const; 55 : 56 : // NOLINTNEXTLINE(google-runtime-references) 57 0 : void pup(PUP::er& /*p*/) {} 58 : 59 0 : bool is_identity() const { return true; } 60 : 61 0 : static constexpr bool supports_hessian{true}; 62 : }; 63 : 64 : template <size_t Dim> 65 0 : inline constexpr bool operator==(const CoordinateMaps::Identity<Dim>& /*lhs*/, 66 : const CoordinateMaps::Identity<Dim>& /*rhs*/) { 67 : return true; 68 : } 69 : 70 : template <size_t Dim> 71 0 : inline constexpr bool operator!=(const CoordinateMaps::Identity<Dim>& lhs, 72 : const CoordinateMaps::Identity<Dim>& rhs) { 73 : return not(lhs == rhs); 74 : } 75 : } // namespace CoordinateMaps 76 : } // namespace domain