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 : #include <iosfwd> 8 : #include <string> 9 : #include <utility> 10 : #include <variant> 11 : #include <vector> 12 : 13 : #include "DataStructures/DataVector.hpp" 14 : #include "NumericalAlgorithms/Spectral/Basis.hpp" 15 : #include "NumericalAlgorithms/Spectral/Quadrature.hpp" 16 : #include "Utilities/GetOutput.hpp" 17 : 18 : /// \cond 19 : namespace PUP { 20 : class er; 21 : } // namespace PUP 22 : template <size_t Dim> 23 : struct ElementId; 24 : template <size_t Dim> 25 : struct Mesh; 26 : /// \endcond 27 : 28 : /*! 29 : * \ingroup DataStructuresGroup 30 : * \brief An untyped tensor component with a name for observation. 31 : * 32 : * The name should be just the name of the tensor component, such as 'Psi_xx'. 33 : * It must not include any slashes ('/'). 34 : */ 35 1 : struct TensorComponent { 36 0 : TensorComponent() = default; 37 0 : TensorComponent(std::string in_name, DataVector in_data); 38 0 : TensorComponent(std::string in_name, std::vector<float> in_data); 39 : 40 : // NOLINTNEXTLINE(google-runtime-references) 41 0 : void pup(PUP::er& p); 42 0 : std::string name{}; 43 0 : std::variant<DataVector, std::vector<float>> data{}; 44 : }; 45 : 46 0 : std::ostream& operator<<(std::ostream& os, const TensorComponent& t); 47 : 48 0 : bool operator==(const TensorComponent& lhs, const TensorComponent& rhs); 49 : 50 0 : bool operator!=(const TensorComponent& lhs, const TensorComponent& rhs); 51 : 52 : /*! 53 : * \ingroup DataStructuresGroup 54 : * \brief Holds tensor components on a grid, to be written into an H5 file 55 : */ 56 1 : struct ElementVolumeData { 57 0 : ElementVolumeData() = default; 58 0 : ElementVolumeData(std::string element_name_in, 59 : std::vector<TensorComponent> components, 60 : std::vector<size_t> extents_in, 61 : std::vector<Spectral::Basis> basis_in, 62 : std::vector<Spectral::Quadrature> quadrature_in); 63 : template <size_t Dim> 64 0 : ElementVolumeData(const ElementId<Dim>& element_id, 65 : std::vector<TensorComponent> components, 66 : const Mesh<Dim>& mesh); 67 : 68 : // NOLINTNEXTLINE(google-runtime-references) 69 0 : void pup(PUP::er& p); 70 : /// Name of the grid (should be human-readable). For standard volume data this 71 : /// name must be the string representation of an ElementId, such as 72 : /// [B0,(L0I1,L0I0,L3I2)]. Code that reads the volume data may rely on this 73 : /// pattern to reconstruct the ElementId. 74 1 : std::string element_name{}; 75 : /// All tensor components on the grid 76 1 : std::vector<TensorComponent> tensor_components{}; 77 : /// Number of grid points in every dimension of the grid 78 1 : std::vector<size_t> extents{}; 79 : /// Spectral::Basis in every dimension of the grid 80 1 : std::vector<Spectral::Basis> basis{}; 81 : /// Spectral::Quadrature in every dimension of the grid 82 1 : std::vector<Spectral::Quadrature> quadrature{}; 83 : }; 84 : 85 0 : bool operator==(const ElementVolumeData& lhs, const ElementVolumeData& rhs); 86 0 : bool operator!=(const ElementVolumeData& lhs, const ElementVolumeData& rhs);