10 #include "DataStructures/DataBox/Tag.hpp"
11 #include "DataStructures/DataVector.hpp"
13 #include "DataStructures/Tensor/EagerMath/Magnitude.hpp"
18 #include "Domain/Structure/DirectionMap.hpp"
19 #include "Evolution/DiscontinuousGalerkin/NormalVectorTags.hpp"
22 #include "Utilities/TypeTraits/CreateHasTypeAlias.hpp"
24 namespace evolution::dg::Actions::detail {
26 CREATE_HAS_TYPE_ALIAS_V(inverse_spatial_metric_tag)
34 using type = tnsr::I<DataVector, Dim, Frame::Inertial>;
50 template <
typename System,
size_t Dim,
typename FieldsOnFaceTags>
51 void unit_normal_vector_and_covector_and_magnitude_impl(
53 const gsl::not_null<tnsr::i<DataVector, Dim, Frame::Inertial>*>
55 const gsl::not_null<Variables<FieldsOnFaceTags>*> fields_on_face,
56 const tnsr::i<DataVector, Dim, Frame::Inertial>&
57 unnormalized_normal_covector) noexcept {
58 if constexpr (has_inverse_spatial_metric_tag_v<System>) {
59 using inverse_spatial_metric_tag =
60 typename System::inverse_spatial_metric_tag;
61 auto& normal_vector = get<NormalVector<Dim>>(*fields_on_face);
62 const auto& inverse_spatial_metric =
63 get<inverse_spatial_metric_tag>(*fields_on_face);
65 for (
size_t i = 0; i < Dim; ++i) {
66 normal_vector.get(i) = inverse_spatial_metric.get(i, 0) *
67 get<0>(unnormalized_normal_covector);
68 for (
size_t j = 1; j < Dim; ++j) {
69 normal_vector.get(i) += inverse_spatial_metric.get(i, j) *
70 unnormalized_normal_covector.get(j);
75 unnormalized_normal_covector);
76 get(*face_normal_magnitude) =
sqrt(
get(*face_normal_magnitude));
77 auto& one_over_normal_vector_magnitude =
78 get<OneOverNormalVectorMagnitude>(*fields_on_face);
79 get(one_over_normal_vector_magnitude) = 1.0 /
get(*face_normal_magnitude);
80 for (
size_t i = 0; i < Dim; ++i) {
81 unit_normal_covector->get(i) = unnormalized_normal_covector.get(i) *
82 get(one_over_normal_vector_magnitude);
83 normal_vector.get(i) *=
get(one_over_normal_vector_magnitude);
86 magnitude(face_normal_magnitude, unnormalized_normal_covector);
87 auto& one_over_normal_vector_magnitude =
88 get<OneOverNormalVectorMagnitude>(*fields_on_face);
89 get(one_over_normal_vector_magnitude) = 1.0 /
get(*face_normal_magnitude);
90 for (
size_t i = 0; i < Dim; ++i) {
91 unit_normal_covector->get(i) = unnormalized_normal_covector.get(i) *
92 get(one_over_normal_vector_magnitude);
111 template <
typename System,
size_t Dim,
typename FieldsOnFaceTags>
112 void unit_normal_vector_and_covector_and_magnitude(
117 normal_covector_quantities,
118 const gsl::not_null<Variables<FieldsOnFaceTags>*> fields_on_face,
121 unnormalized_normal_covectors,
123 moving_mesh_map) noexcept {
124 const bool mesh_is_moving = not moving_mesh_map.is_identity();
125 const auto& unnormalized_normal_covector =
126 unnormalized_normal_covectors.at(direction);
128 if (
auto& normal_covector_quantity =
129 normal_covector_quantities->at(direction);
130 detail::has_inverse_spatial_metric_tag_v<System> or mesh_is_moving or
131 not normal_covector_quantity.has_value()) {
132 if (not normal_covector_quantity.has_value()) {
133 normal_covector_quantity = Variables<
136 fields_on_face->number_of_grid_points()};
138 detail::unit_normal_vector_and_covector_and_magnitude_impl<System>(
140 &get<evolution::dg::Tags::InternalFace::MagnitudeOfNormal>(
141 *normal_covector_quantity)),
144 *normal_covector_quantity)),
145 fields_on_face, unnormalized_normal_covector);