Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : 8 : #include "DataStructures/Tensor/EagerMath/FrameTransform.hpp" 9 : #include "DataStructures/Tensor/Metafunctions.hpp" 10 : #include "DataStructures/Tensor/TypeAliases.hpp" 11 : #include "DataStructures/Variables.hpp" 12 : #include "Utilities/Gsl.hpp" 13 : 14 : namespace transform { 15 : 16 : /// Tags to represent the result of frame-transforming Variables 17 1 : namespace Tags { 18 : /// The `Tag` with the first index transformed to a different frame 19 : template <typename Tag, typename FirstIndexFrame> 20 1 : struct TransformedFirstIndex : db::SimpleTag { 21 0 : using type = TensorMetafunctions::prepend_spatial_index< 22 : TensorMetafunctions::remove_first_index<typename Tag::type>, 23 : tmpl::front<typename Tag::type::index_list>::dim, UpLo::Up, 24 : FirstIndexFrame>; 25 : }; 26 : } // namespace Tags 27 : 28 : /// @{ 29 : /// Transforms the first index of all tensors in the Variables to a different 30 : /// frame 31 : /// 32 : /// See single-Tensor overload for details. 33 : template <typename... ResultTags, typename... InputTags, size_t Dim, 34 : typename SourceFrame, typename TargetFrame> 35 1 : void first_index_to_different_frame( 36 : const gsl::not_null<Variables<tmpl::list<ResultTags...>>*> result, 37 : const Variables<tmpl::list<InputTags...>>& input, 38 : const InverseJacobian<DataVector, Dim, SourceFrame, TargetFrame>& 39 : inv_jacobian) { 40 : EXPAND_PACK_LEFT_TO_RIGHT( 41 : first_index_to_different_frame(make_not_null(&get<ResultTags>(*result)), 42 : get<InputTags>(input), inv_jacobian)); 43 : } 44 : 45 : template <typename... InputTags, size_t Dim, typename SourceFrame, 46 : typename TargetFrame, 47 : typename ResultVars = Variables<tmpl::list< 48 : Tags::TransformedFirstIndex<InputTags, SourceFrame>...>>> 49 1 : ResultVars first_index_to_different_frame( 50 : const Variables<tmpl::list<InputTags...>>& input, 51 : const InverseJacobian<DataVector, Dim, SourceFrame, TargetFrame>& 52 : inv_jacobian) { 53 : ResultVars result{input.number_of_grid_points()}; 54 : first_index_to_different_frame(make_not_null(&result), input, inv_jacobian); 55 : return result; 56 : } 57 : /// @} 58 : 59 : } // namespace transform