#ifndef POLY_UTILS_OPERATOR_H #define POLY_UTILS_OPERATOR_H #include "mfem.hpp" #include class PolytropeOperator : public mfem::Operator { public: PolytropeOperator( std::unique_ptr M, std::unique_ptr Q, std::unique_ptr D, std::unique_ptr f, const mfem::Array &blockOffsets); ~PolytropeOperator() override = default; void Mult(const mfem::Vector &x, mfem::Vector &y) const override; mfem::Operator& GetGradient(const mfem::Vector &x) const override; void SetEssentialTrueDofs(const mfem::Array &theta_ess_tofs, const mfem::Array &phi_ess_tofs); private: std::unique_ptr m_M; std::unique_ptr m_Q; std::unique_ptr m_D; std::unique_ptr m_f; const mfem::Array &m_blockOffsets; mfem::Array m_theta_ess_tofs; mfem::Array m_phi_ess_tofs; std::unique_ptr m_Mmat; std::unique_ptr m_Qmat; std::unique_ptr m_Dmat; std::unique_ptr m_negM_op; std::unique_ptr m_negQ_op; mutable std::unique_ptr m_jacobian; }; #endif // POLY_UTILS_OPERATOR_H