SpECTRE Documentation Coverage Report
Current view: top level - NumericalAlgorithms/DiscontinuousGalerkin - SimpleMortarData.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 45.0 % 20 9
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            0 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : #pragma once
       5              : 
       6              : #include <optional>
       7              : #include <ostream>
       8              : #include <pup.h>
       9              : #include <utility>
      10              : 
      11              : #include "Utilities/ErrorHandling/Assert.hpp"
      12              : #include "Utilities/Serialization/PupStlCpp17.hpp"
      13              : 
      14              : namespace dg {
      15              : 
      16              : /// \ingroup DiscontinuousGalerkinGroup
      17              : /// \brief Storage of boundary data on two sides of a mortar
      18              : ///
      19              : /// Typically, values are inserted into this container by the flux
      20              : /// communication actions.
      21              : template <typename TemporalId, typename LocalVars, typename RemoteVars>
      22            1 : class SimpleMortarData {
      23              :  public:
      24            0 :   SimpleMortarData() = default;
      25            0 :   SimpleMortarData(const SimpleMortarData&) = default;
      26            0 :   SimpleMortarData(SimpleMortarData&&) = default;
      27            0 :   SimpleMortarData& operator=(const SimpleMortarData&) = default;
      28            0 :   SimpleMortarData& operator=(SimpleMortarData&&) = default;
      29            0 :   ~SimpleMortarData() = default;
      30              : 
      31              :   /// The argument is ignored.  It exists for compatibility with
      32              :   /// BoundaryHistory.
      33            1 :   explicit SimpleMortarData(const size_t /*integration_order*/) {}
      34              : 
      35              :   /// These functions do nothing.  They exist for compatibility with
      36              :   /// BoundaryHistory.
      37              :   /// @{
      38            1 :   size_t integration_order() const { return 0; }
      39            1 :   void integration_order(const size_t /*integration_order*/) {}
      40              :   /// @}
      41              : 
      42              :   /// Add a value.  This function must be called once between calls to
      43              :   /// extract.
      44              :   /// @{
      45            1 :   void local_insert(TemporalId temporal_id, LocalVars vars);
      46            1 :   void remote_insert(TemporalId temporal_id, RemoteVars vars);
      47              :   /// @}
      48              : 
      49              :   /// Return the inserted data and reset the state to empty.
      50            1 :   std::pair<LocalVars, RemoteVars> extract();
      51              : 
      52              :   // NOLINTNEXTLINE(google-runtime-references)
      53            0 :   void pup(PUP::er& p);
      54              : 
      55              :   /// Retrieve the local data at `temporal_id`
      56            1 :   const LocalVars& local_data(const TemporalId& temporal_id) const {
      57              :     ASSERT(local_data_, "Local data not available.");
      58              :     ASSERT(temporal_id == temporal_id_,
      59              :            "Only have local data at temporal_id "
      60              :                << temporal_id_ << ", but requesting at " << temporal_id);
      61              :     return *local_data_;
      62              :   };
      63              : 
      64              :   /// Retrieve the remote data at `temporal_id`
      65            1 :   const RemoteVars& remote_data(const TemporalId& temporal_id) const {
      66              :     ASSERT(remote_data_, "Remote data not available.");
      67              :     ASSERT(temporal_id == temporal_id_,
      68              :            "Only have remote data at temporal_id "
      69              :                << temporal_id_ << ", but requesting at " << temporal_id);
      70              :     return *remote_data_;
      71              :   };
      72              : 
      73              :  private:
      74            0 :   TemporalId temporal_id_{};
      75            0 :   std::optional<LocalVars> local_data_{};
      76            0 :   std::optional<RemoteVars> remote_data_{};
      77              : };
      78              : 
      79              : template <typename TemporalId, typename LocalVars, typename RemoteVars>
      80              : void SimpleMortarData<TemporalId, LocalVars, RemoteVars>::local_insert(
      81              :     TemporalId temporal_id, LocalVars vars) {
      82              :   ASSERT(not local_data_.has_value(), "Already received local data.");
      83              :   ASSERT(not remote_data_.has_value() or temporal_id == temporal_id_,
      84              :          "Received local data at " << temporal_id
      85              :                                    << ", but already have remote data at "
      86              :                                    << temporal_id_);
      87              :   temporal_id_ = std::move(temporal_id);
      88              :   local_data_ = std::move(vars);
      89              : }
      90              : 
      91              : template <typename TemporalId, typename LocalVars, typename RemoteVars>
      92              : void SimpleMortarData<TemporalId, LocalVars, RemoteVars>::remote_insert(
      93              :     TemporalId temporal_id, RemoteVars vars) {
      94              :   ASSERT(not remote_data_.has_value(), "Already received remote data.");
      95              :   ASSERT(not local_data_.has_value() or temporal_id == temporal_id_,
      96              :          "Received remote data at " << temporal_id
      97              :                                     << ", but already have local data at "
      98              :                                     << temporal_id_);
      99              :   temporal_id_ = std::move(temporal_id);
     100              :   remote_data_ = std::move(vars);
     101              : }
     102              : 
     103              : template <typename TemporalId, typename LocalVars, typename RemoteVars>
     104              : std::pair<LocalVars, RemoteVars>
     105              : SimpleMortarData<TemporalId, LocalVars, RemoteVars>::extract() {
     106              :   ASSERT(local_data_.has_value() and remote_data_.has_value(),
     107              :          "Tried to extract boundary data, but do not have "
     108              :              << (local_data_ ? "remote" : remote_data_ ? "local" : "any")
     109              :              << " data.");
     110              :   auto result =
     111              :       std::make_pair(std::move(*local_data_), std::move(*remote_data_));
     112              :   local_data_ = std::nullopt;
     113              :   remote_data_ = std::nullopt;
     114              :   return result;
     115              : }
     116              : 
     117              : template <typename TemporalId, typename LocalVars, typename RemoteVars>
     118              : void SimpleMortarData<TemporalId, LocalVars, RemoteVars>::pup(PUP::er& p) {
     119              :   p | temporal_id_;
     120              :   p | local_data_;
     121              :   p | remote_data_;
     122              : }
     123              : 
     124              : }  // namespace dg
        

Generated by: LCOV version 2.0-1