Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 : #include <optional>
9 :
10 : #include "DataStructures/DataVector.hpp"
11 : #include "DataStructures/Tensor/EagerMath/DotProduct.hpp"
12 : #include "DataStructures/Tensor/EagerMath/Magnitude.hpp" // For Tags::Normalized
13 : #include "DataStructures/Tensor/Tensor.hpp"
14 : #include "Domain/InterfaceHelpers.hpp"
15 : #include "Domain/Tags.hpp"
16 : #include "Domain/TagsTimeDependent.hpp"
17 : #include "Utilities/Gsl.hpp"
18 : #include "Utilities/TMPL.hpp"
19 :
20 : namespace domain {
21 : namespace Tags {
22 : /// Compute the characteristic speeds on the moving mesh given the
23 : /// characteristic speeds if the mesh were stationary.
24 : ///
25 : /// \note Assumes that `typename CharSpeedsComputeTag::return_type` is a
26 : /// `std::array<DataVector, NumberOfCharSpeeds>`
27 : template <typename CharSpeedsComputeTag, size_t Dim>
28 1 : struct CharSpeedCompute : CharSpeedsComputeTag::base, db::ComputeTag {
29 0 : using base = typename CharSpeedsComputeTag::base;
30 0 : using return_type = typename CharSpeedsComputeTag::return_type;
31 :
32 : template <typename... Ts, typename T, size_t NumberOfCharSpeeds>
33 0 : static void function(
34 : const gsl::not_null<std::array<T, NumberOfCharSpeeds>*> result,
35 : const std::optional<tnsr::I<DataVector, Dim, Frame::Inertial>>&
36 : grid_velocity,
37 : const tnsr::i<DataVector, Dim, Frame::Inertial>& unit_normal_covector,
38 : const Ts&... ts) {
39 : // Note that while the CharSpeedsComputeTag almost certainly also needs the
40 : // unit normal covector for computing the original characteristic speeds, we
41 : // don't know which of the `ts` it is, and thus we need the unit normal
42 : // covector to be passed explicitly.
43 : CharSpeedsComputeTag::function(result, ts...);
44 : if (grid_velocity.has_value()) {
45 : const Scalar<DataVector> normal_dot_velocity =
46 : dot_product(*grid_velocity, unit_normal_covector);
47 : for (size_t i = 0; i < result->size(); ++i) {
48 : gsl::at(*result, i) -= get(normal_dot_velocity);
49 : }
50 : }
51 : }
52 :
53 0 : using argument_tags =
54 : tmpl::push_front<typename CharSpeedsComputeTag::argument_tags,
55 : MeshVelocity<Dim, Frame::Inertial>,
56 : ::Tags::Normalized<UnnormalizedFaceNormal<Dim>>>;
57 0 : using volume_tags = get_volume_tags<CharSpeedsComputeTag>;
58 : };
59 : } // namespace Tags
60 : } // namespace domain
|