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 <cstdint> 9 : #include <optional> 10 : #include <type_traits> 11 : 12 : #include "DataStructures/DataBox/DataBox.hpp" 13 : #include "DataStructures/DataVector.hpp" 14 : #include "DataStructures/Tensor/Tensor.hpp" 15 : #include "DataStructures/Transpose.hpp" 16 : #include "Evolution/DgSubcell/Tags/Mesh.hpp" 17 : #include "Evolution/DgSubcell/Tags/ReconstructionOrder.hpp" 18 : #include "NumericalAlgorithms/Spectral/Mesh.hpp" 19 : #include "Utilities/Gsl.hpp" 20 : #include "Utilities/SetNumberOfGridPoints.hpp" 21 : 22 : namespace evolution::dg::subcell { 23 : /// Copies the `reconstruction_order` into the DataBox tag 24 : /// `evolution::dg::subcell::Tags::ReconstructionOrder` if 25 : /// `reconstruction_order` has a value. 26 : template <size_t Dim, typename DbTagsList> 27 1 : void store_reconstruction_order_in_databox( 28 : const gsl::not_null<db::DataBox<DbTagsList>*> box, 29 : const std::optional<std::array<gsl::span<std::uint8_t>, Dim>>& 30 : reconstruction_order) { 31 : if (reconstruction_order.has_value()) { 32 : db::mutate<evolution::dg::subcell::Tags::ReconstructionOrder<Dim>>( 33 : [&reconstruction_order](const auto recons_order_ptr, 34 : const ::Mesh<Dim>& subcell_mesh) { 35 : if (UNLIKELY(not recons_order_ptr->has_value())) { 36 : (*recons_order_ptr) = typename std::decay_t< 37 : decltype(*recons_order_ptr)>::value_type{}; 38 : } 39 : set_number_of_grid_points( 40 : make_not_null(&(recons_order_ptr->value())), 41 : subcell_mesh.number_of_grid_points()); 42 : for (size_t d = Dim - 1; d < Dim; --d) { 43 : // The data is always in d-varies fastest ordering 44 : // 45 : // We always copy into the `d=0` buffer, then do transposes later. 46 : for (size_t j = 0; 47 : j < subcell_mesh.slice_away(d).number_of_grid_points(); ++j) { 48 : for (size_t i = 0; i < subcell_mesh.extents(d); ++i) { 49 : get<0>(recons_order_ptr 50 : ->value())[j * subcell_mesh.extents(d) + i] = 51 : gsl::at(reconstruction_order.value(), 52 : d)[j * (subcell_mesh.extents(d) + 2) + i + 1]; 53 : } 54 : } 55 : if (d == 1) { 56 : // Order is (y, z, x) -> (x, y, z) 57 : transpose(make_not_null(&recons_order_ptr->value().get(d)), 58 : get<0>(recons_order_ptr->value()), 59 : subcell_mesh.extents(1) * 60 : (Dim > 2 ? subcell_mesh.extents(2) : 1), 61 : subcell_mesh.number_of_grid_points() / 62 : (subcell_mesh.extents(1) * 63 : (Dim > 2 ? subcell_mesh.extents(2) : 1))); 64 : } else if (d == 2) { 65 : // Order is (z, x, y) -> (x, y, z) 66 : transpose(make_not_null(&recons_order_ptr->value().get(d)), 67 : get<0>(recons_order_ptr->value()), 68 : subcell_mesh.extents(2), 69 : subcell_mesh.number_of_grid_points() / 70 : subcell_mesh.extents(2)); 71 : } 72 : // } 73 : } 74 : }, 75 : box, db::get<evolution::dg::subcell::Tags::Mesh<Dim>>(*box)); 76 : } 77 : } 78 : } // namespace evolution::dg::subcell