LCOV - code coverage report
Current view: top level - fem/libceed - operator.hpp (source / functions) Coverage Total Hit
Test: Palace Coverage Report Lines: 33.3 % 6 2
Test Date: 2025-10-23 22:45:05 Functions: 0.0 % 2 0
Legend: Lines: hit not hit

            Line data    Source code
       1              : // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
       2              : // SPDX-License-Identifier: Apache-2.0
       3              : 
       4              : #ifndef PALACE_LIBCEED_OPERATOR_HPP
       5              : #define PALACE_LIBCEED_OPERATOR_HPP
       6              : 
       7              : #include <memory>
       8              : #include <vector>
       9              : #include "fem/libceed/ceed.hpp"
      10              : #include "linalg/operator.hpp"
      11              : #include "linalg/vector.hpp"
      12              : 
      13              : namespace palace
      14              : {
      15              : 
      16              : class FiniteElementSpace;
      17              : 
      18              : namespace hypre
      19              : {
      20              : 
      21              : class HypreCSRMatrix;
      22              : 
      23              : }  // namespace hypre
      24              : 
      25              : namespace ceed
      26              : {
      27              : 
      28              : //
      29              : // Wrapper class for libCEED's CeedOperator, supporting composite operator construction and
      30              : // application with multiple threads.
      31              : //
      32              : class Operator : public palace::Operator
      33              : {
      34              : protected:
      35              :   std::vector<CeedOperator> op, op_t;
      36              :   std::vector<CeedVector> u, v;
      37              :   Vector dof_multiplicity;
      38              :   mutable Vector temp;
      39              : 
      40              : public:
      41              :   Operator(int h, int w);
      42              :   ~Operator() override;
      43              : 
      44              :   CeedOperator operator[](std::size_t i) const { return op[i]; }
      45              : 
      46              :   auto Size() const { return op.size(); }
      47              : 
      48              :   void AddSubOperator(CeedOperator sub_op, CeedOperator sub_op_t = nullptr);
      49              : 
      50              :   void Finalize();
      51              : 
      52              :   void DestroyAssemblyData() const;
      53              : 
      54          558 :   void SetDofMultiplicity(Vector &&mult) { dof_multiplicity = std::move(mult); }
      55              : 
      56              :   void AssembleDiagonal(Vector &diag) const override;
      57              : 
      58              :   void Mult(const Vector &x, Vector &y) const override;
      59              : 
      60              :   void AddMult(const Vector &x, Vector &y, const double a = 1.0) const override;
      61              : 
      62              :   void MultTranspose(const Vector &x, Vector &y) const override;
      63              : 
      64              :   void AddMultTranspose(const Vector &x, Vector &y, const double a = 1.0) const override;
      65              : };
      66              : 
      67              : // A symmetric ceed::Operator replaces *MultTranspose with *Mult (by default, libCEED
      68              : // operators do not have a transpose operation).
      69              : class SymmetricOperator : public Operator
      70              : {
      71              : public:
      72         5928 :   using Operator::Operator;
      73              : 
      74            0 :   void MultTranspose(const Vector &x, Vector &y) const override { Mult(x, y); }
      75            0 :   void AddMultTranspose(const Vector &x, Vector &y, double a = 1.0) const override
      76              :   {
      77            0 :     AddMult(x, y, a);
      78            0 :   }
      79              : };
      80              : 
      81              : // Assemble a ceed::Operator as a CSR matrix.
      82              : std::unique_ptr<hypre::HypreCSRMatrix> CeedOperatorFullAssemble(const Operator &op,
      83              :                                                                 bool skip_zeros, bool set);
      84              : 
      85              : // Construct a coarse-level ceed::Operator, reusing the quadrature data and quadrature
      86              : // function from the fine-level operator. Only available for square, symmetric operators
      87              : // (same input and output spaces).
      88              : std::unique_ptr<Operator> CeedOperatorCoarsen(const Operator &op_fine,
      89              :                                               const FiniteElementSpace &fespace_coarse);
      90              : 
      91              : }  // namespace ceed
      92              : 
      93              : }  // namespace palace
      94              : 
      95              : #endif  // PALACE_LIBCEED_OPERATOR_HPP
        

Generated by: LCOV version 2.0-1