SpECTRE Documentation Coverage Report
Current view: top level - DataStructures - ComplexDiagonalModalOperator.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 2.4 % 41 1
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 "DataStructures/ComplexModalVector.hpp"
       7              : #include "DataStructures/DataVector.hpp"
       8              : #include "DataStructures/DiagonalModalOperator.hpp"
       9              : #include "DataStructures/VectorImpl.hpp"
      10              : #include "Utilities/TMPL.hpp"
      11              : 
      12              : /// \cond
      13              : class DiagonalModalOperator;
      14              : class ModalVector;
      15              : class ComplexDiagonalModalOperator;
      16              : /// \endcond
      17              : 
      18              : namespace blaze {
      19            0 : DECLARE_GENERAL_VECTOR_BLAZE_TRAITS(ComplexDiagonalModalOperator);
      20              : }  // namespace blaze
      21              : 
      22              : /*!
      23              :  * \ingroup DataStructuresGroup
      24              :  * \brief A class for an element-wise complex multiplier of modal coefficients.
      25              :  *
      26              :  * \details A `ComplexDiagonalModalOperator` holds an array of factors to
      27              :  * multiply by spectral coefficients, and can be either owning (the array is
      28              :  * deleted when the `ComplexDiagonalModalOperator` goes out of scope) or
      29              :  * non-owning, meaning it just has a pointer to an array.
      30              :  *
      31              :  * `ComplexDiagonalModalOperator`s are intended to represent a diagonal matrix
      32              :  * that can operate (via the `*` operator) on spectral coefficients represented
      33              :  * by `ComplexModalVector`s easily. Only basic mathematical operations are
      34              :  * supported with `ComplexDiagonalModalOperator`s.
      35              :  * `ComplexDiagonalModalOperator`s may be added, subtracted, multiplied, or
      36              :  * divided, and all arithmetic operations are similarly supported between
      37              :  * `ComplexDiagonalModalOperator`s and `DiagonalModalOperator`s. In addition,
      38              :  * the following operations with modal data structures are supported:
      39              :  * - multiplication of a `ComplexDiagonalModalOperator` and a
      40              :  *   `ComplexModalVector` resulting in a `ComplexModalVector`
      41              :  * - multiplication of a `ComplexDiagonalModalOperator` and a `ModalVector`
      42              :  *   resulting in a `ComplexModalVector`
      43              :  * - multiplication of a `DiagonalModalOperator` and a `ComplexModalVector`
      44              :  *   resulting in a `ComplexModalVector`
      45              :  * All of these multiplication operations are commutative, supporting the
      46              :  * interpretation of the modal data structure as either a 'row' or a 'column'
      47              :  * vector.
      48              :  *
      49              :  * The following unary operations are supported with
      50              :  * `ComplexDiagonalModalOperator`s:
      51              :  * - conj
      52              :  * - imag (results in a `DiagonalModalOperator`)
      53              :  * - real (results in a `DiagonalModalOperator`)
      54              :  *
      55              :  * Also, addition, subtraction, multiplication and division of
      56              :  * `DiagonalModalOperator`s with `std::complex<double>`s or `double`s is
      57              :  * supported.
      58              :  */
      59            1 : class ComplexDiagonalModalOperator
      60              :     : public VectorImpl<std::complex<double>, ComplexDiagonalModalOperator> {
      61              :  public:
      62            0 :   ComplexDiagonalModalOperator() = default;
      63            0 :   ComplexDiagonalModalOperator(const ComplexDiagonalModalOperator&) = default;
      64            0 :   ComplexDiagonalModalOperator(ComplexDiagonalModalOperator&&) = default;
      65            0 :   ComplexDiagonalModalOperator& operator=(const ComplexDiagonalModalOperator&) =
      66              :       default;
      67            0 :   ComplexDiagonalModalOperator& operator=(ComplexDiagonalModalOperator&&) =
      68              :       default;
      69            0 :   ~ComplexDiagonalModalOperator() = default;
      70              : 
      71            0 :   using BaseType =
      72              :       VectorImpl<std::complex<double>, ComplexDiagonalModalOperator>;
      73              : 
      74              :   using BaseType::operator=;
      75              :   using BaseType::VectorImpl;
      76              : };
      77              : 
      78              : namespace blaze {
      79            0 : VECTOR_BLAZE_TRAIT_SPECIALIZE_ARITHMETIC_TRAITS(ComplexDiagonalModalOperator);
      80              : 
      81            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      82              :                                                DiagonalModalOperator, AddTrait,
      83              :                                                ComplexDiagonalModalOperator);
      84            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      85              :                                                DiagonalModalOperator, DivTrait,
      86              :                                                ComplexDiagonalModalOperator);
      87            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      88              :                                                DiagonalModalOperator, MultTrait,
      89              :                                                ComplexDiagonalModalOperator);
      90            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      91              :                                                DiagonalModalOperator, SubTrait,
      92              :                                                ComplexDiagonalModalOperator);
      93              : 
      94            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      95              :                                                double, AddTrait,
      96              :                                                ComplexDiagonalModalOperator);
      97            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
      98              :                                                double, DivTrait,
      99              :                                                ComplexDiagonalModalOperator);
     100            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
     101              :                                                double, MultTrait,
     102              :                                                ComplexDiagonalModalOperator);
     103            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexDiagonalModalOperator,
     104              :                                                double, SubTrait,
     105              :                                                ComplexDiagonalModalOperator);
     106              : 
     107            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(DiagonalModalOperator,
     108              :                                                std::complex<double>, AddTrait,
     109              :                                                ComplexDiagonalModalOperator);
     110            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(DiagonalModalOperator,
     111              :                                                std::complex<double>, DivTrait,
     112              :                                                ComplexDiagonalModalOperator);
     113            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(DiagonalModalOperator,
     114              :                                                std::complex<double>, MultTrait,
     115              :                                                ComplexDiagonalModalOperator);
     116            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(DiagonalModalOperator,
     117              :                                                std::complex<double>, SubTrait,
     118              :                                                ComplexDiagonalModalOperator);
     119              : 
     120            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexModalVector,
     121              :                                                DiagonalModalOperator,
     122              :                                                MultTrait, ComplexModalVector);
     123            0 : BLAZE_TRAIT_SPECIALIZE_COMPATIBLE_BINARY_TRAIT(ComplexModalVector,
     124              :                                                ComplexDiagonalModalOperator,
     125              :                                                MultTrait, ComplexModalVector);
     126              : template <>
     127            0 : struct MultTrait<ModalVector, ComplexDiagonalModalOperator> {
     128            0 :   using Type = ComplexModalVector;
     129              : };
     130              : template <>
     131            0 : struct MultTrait<ComplexDiagonalModalOperator, ModalVector> {
     132            0 :   using Type = ComplexModalVector;
     133              : };
     134              : 
     135              : template <typename Operator>
     136            0 : struct MapTrait<ComplexDiagonalModalOperator, Operator> {
     137              :   // Selectively allow unary operations for spectral coefficient operators
     138              :   static_assert(tmpl::list_contains_v<
     139              :                     tmpl::list<blaze::Conj, blaze::Sqrt,
     140              :                                blaze::Bind1st<blaze::Add, std::complex<double>>,
     141              :                                blaze::Bind2nd<blaze::Add, std::complex<double>>,
     142              :                                blaze::Bind1st<blaze::Div, std::complex<double>>,
     143              :                                blaze::Bind2nd<blaze::Div, std::complex<double>>,
     144              :                                blaze::Bind1st<blaze::Sub, std::complex<double>>,
     145              :                                blaze::Bind2nd<blaze::Sub, std::complex<double>>,
     146              :                                blaze::Bind1st<blaze::Add, double>,
     147              :                                blaze::Bind2nd<blaze::Add, double>,
     148              :                                blaze::Bind1st<blaze::Div, double>,
     149              :                                blaze::Bind2nd<blaze::Div, double>,
     150              :                                blaze::Bind1st<blaze::Sub, double>,
     151              :                                blaze::Bind2nd<blaze::Sub, double>>,
     152              :                     Operator>,
     153              :                 "This unary operation is not permitted on a "
     154              :                 "ComplexDiagonalModalOperator");
     155            0 :   using Type = ComplexDiagonalModalOperator;
     156              : };
     157              : template <>
     158            0 : struct MapTrait<ComplexDiagonalModalOperator, blaze::Imag> {
     159            0 :   using Type = DiagonalModalOperator;
     160              : };
     161              : template <>
     162            0 : struct MapTrait<ComplexDiagonalModalOperator, blaze::Real> {
     163            0 :   using Type = DiagonalModalOperator;
     164              : };
     165              : template <>
     166            0 : struct MapTrait<DiagonalModalOperator, blaze::Imag> {
     167            0 :   using Type = DiagonalModalOperator;
     168              : };
     169              : template <>
     170            0 : struct MapTrait<DiagonalModalOperator, blaze::Real> {
     171            0 :   using Type = DiagonalModalOperator;
     172              : };
     173              : 
     174              : template <typename Operator>
     175            0 : struct MapTrait<ComplexDiagonalModalOperator, ComplexDiagonalModalOperator,
     176              :                 Operator> {
     177              :   // Forbid math operations in this specialization of BinaryMap traits for
     178              :   // ComplexDiagonalModalOperator that are unlikely to be used on spectral
     179              :   // coefficients. Currently no non-arithmetic binary operations are supported.
     180              :   static_assert(tmpl::list_contains_v<tmpl::list<>, Operator>,
     181              :                 "This binary operation is not permitted on a "
     182              :                 "ComplexDiagonalModalOperator.");
     183            0 :   using Type = ComplexDiagonalModalOperator;
     184              : };
     185              : }  // namespace blaze
     186              : 
     187              : MAKE_STD_ARRAY_VECTOR_BINOPS(ComplexDiagonalModalOperator)
     188              : 
     189              : MAKE_WITH_VALUE_IMPL_DEFINITION_FOR(ComplexDiagonalModalOperator)
        

Generated by: LCOV version 2.0-1