Line data Source code
1 1 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : /// \file
5 : /// Defines metafunctions for manipulating Tags that refer to Tensors
6 :
7 : #pragma once
8 :
9 : #include "DataStructures/Tensor/IndexType.hpp"
10 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
11 : #include "Utilities/TMPL.hpp"
12 :
13 : namespace TensorMetafunctions {
14 : /// \ingroup TensorGroup
15 : /// \brief Replaces Tag with an equivalent Tag but in frame NewFrame
16 : template <typename Tag, typename NewFrame>
17 1 : struct replace_frame_in_tag {
18 : // Base definition, for tags with no template parameters,
19 : // like some scalars.
20 0 : using type = Tag;
21 : };
22 : // Specialization for tensors in gr::Tags / gh::Tags
23 : template <template <typename, size_t, typename> typename Tag, size_t Dim,
24 : typename Frame, typename DataType, typename NewFrame>
25 0 : struct replace_frame_in_tag<Tag<DataType, Dim, Frame>, NewFrame> {
26 0 : using type = Tag<DataType, Dim, NewFrame>;
27 : };
28 : // Specialization for scalars in gr::Tags (which have a DataType).
29 : template <template <typename> typename Tag, typename DataType,
30 : typename NewFrame>
31 0 : struct replace_frame_in_tag<Tag<DataType>, NewFrame> {
32 0 : using type = Tag<DataType>;
33 : };
34 : // Specializations for Tags::deriv<Tag> with Tag in gh::Tags
35 : template <template <typename, size_t, typename> typename Tag, typename DataType,
36 : size_t Dim, typename Frame, typename NewFrame>
37 0 : struct replace_frame_in_tag<
38 : ::Tags::deriv<Tag<DataType, Dim, Frame>, tmpl::size_t<Dim>, Frame>,
39 : NewFrame> {
40 0 : using type =
41 : ::Tags::deriv<Tag<DataType, Dim, NewFrame>, tmpl::size_t<Dim>, NewFrame>;
42 : };
43 : template <template <typename> typename Tag, typename DataType, size_t Dim,
44 : typename Frame, typename NewFrame>
45 0 : struct replace_frame_in_tag<
46 : ::Tags::deriv<Tag<DataType>, tmpl::size_t<Dim>, Frame>, NewFrame> {
47 0 : using type = ::Tags::deriv<Tag<DataType>, tmpl::size_t<Dim>, NewFrame>;
48 : };
49 : // Specialization for inverse jacobian
50 : template <template <size_t, typename, typename> typename Tag, size_t Dim,
51 : typename SrcFrame, typename TargetFrame, typename NewTargetFrame>
52 0 : struct replace_frame_in_tag<Tag<Dim, SrcFrame, TargetFrame>, NewTargetFrame> {
53 0 : using type = Tag<Dim, SrcFrame, NewTargetFrame>;
54 : };
55 :
56 : /// \ingroup TensorGroup
57 : /// \brief Replaces Tag with an equivalent Tag but in frame NewFrame
58 : template <typename Tag, typename NewFrame>
59 1 : using replace_frame_in_tag_t =
60 : typename replace_frame_in_tag<Tag, NewFrame>::type;
61 :
62 : /// \ingroup TensorGroup
63 : /// \brief Replaces every Tag in Taglist with an equivalent Tag
64 : /// but in frame NewFrame
65 : template <typename TagList, typename NewFrame>
66 1 : using replace_frame_in_taglist =
67 : tmpl::transform<TagList,
68 : tmpl::bind<replace_frame_in_tag_t, tmpl::_1, NewFrame>>;
69 : } // namespace TensorMetafunctions
|